JAVA面向对象编程学习(7)控制反转与MVC模式

控制反转

GUI(图形用户界面)给应用程序提供界面,其中包括窗口、菜单、按钮和其他图形组件,这就是今天大多 数人所熟悉的“典型”应用程序界面。
图形用户界面所涉及的细节很多,我们的课程并不打算教授GUI,但是我们打算借助GUI来介绍两个设计思想:控制反转和MVC设计模式。

部件是创建GUI的独立部分,比如像按钮、菜单、菜单项、选择框、滑动条、文本框等。Java类库中有不少现成的部件。

布局是指如何在屏幕上放置组件。过去,大多数简单的GUI系统让程序员在二维坐标系上 指定每个组件的x和y坐标(以像素点为单位),这对于现代的GUI系统来说太简单了。因为现代的GUI系统还得考虑不同的屏幕分辨率、不同的字体、用户可改变的窗口尺寸,以及许多其他使得布局困难的因素。所以需要有一种能更通用地指定布局的方法,比如,要求“这个部件应该在那个部件的下面“或者”这个部件在窗口改变尺寸时能自动拉伸,但是其他部件保持尺寸不变”。这些可以通过**布局管理器(layout manager)**来实现。

事件处理是用来响应用户输入的技术。创建了部件并且放在屏幕上合适的位置以后,就得 要有办法来处理诸如用户点击按钮这样的事情。Java类库处理这类事情的模型是基于事件的。 如果用户激活了一个部件(比如,点击按钮或者选择菜单项),系统就会产生一个事件应用 程序可以收到关于这个事件的通知(以程序的一个方法被调用的方式),然后就可以采取程序该做的动作了。(callback)

布局管理器(layout manage)

在JAVA中的layout manage可以通过代码自动将布局的组件放在合适的地方,设计出合适的视觉效果,能够保证程序员所部署的组件都能够被用户所看见。

Swing

Swing使用一个非常灵活的模型来处理GUI的输入:采用事件监听器的事件处理(event handling)模型。
Swing框架本身以及大部分部件在发生一些情况时会触发相关的事件,而其他的对象也许会对这些事件感兴趣。不同类型的动作会导致不同类型的事件。当点击一个按钮或选中一个菜单项,部件就会触发动作事件;而当点击或移动鼠标时,会触发鼠标事件;当框架被关闭或最小化时,会触发窗口事件。另外还有许多种其他事件

所有的对象都可以成为任何这些事件的监听器,而一旦成为监听器,就可以得到这些事件触发的通知

实现了众多监听器接口之一的对象就成为一个事件监听器。如果对象实现了恰当的接口, 就可以注册到它想监听的组件上

控制反转

这是我们设计的一个根据按钮而输出控制台信息的测试程序,可以看到,使用这些组件可以有效地监听到用户的操作

		//这是创建一个框和按钮
		JFrame frame =new JFrame();
		frame.setVisible(true);
		JButton btnButton=new JButton("单步");
		frame.add(btnButton,BorderLayout.NORTH);
		System.out.print("按下力");
		btnButton.addActionListener(new ActionListener()
		{
			
			@Override
			public void actionPerformed(ActionEvent e) 
			{
				System.out.print("按下力");
				
			}
		});

我们可以来理解一下这个过程:
首先是Jbutton提供了一个接口,接受所有能够实现ActionLisener对象的对象,然后这个对象就在JButton里面注册了,JButton会去监控在里面注册了的对象,当被单击了,JButton会回去看有哪几个对象对这个事件是感兴趣的,假如感兴趣,然后就会去执行actionPerformed(ActionEvent e) 这个我们重载的函数,相当于一个信号发出到JButton,然后Jbutton由发出信号到我们感兴趣的地方,这期间,信息流发生了反转,因此称之为控制反转。

更为有条理的,可以梳理为:
①由按钮公布一个守听者接口和一对注册/注销函数
②你的代码实现那个接口,将守听者注册在按钮上
③一旦按钮被按下,就会反过来调用你的守听者对象的某个函数

内部类

内部类就是指一个类定义在另一个类的内部,从而成为外部类的一个成员。因此一个类中可以有成员变量、方法,还可以有内部类。实际上Java的内部类可以被称为成员类,内部类实际上是它所在类的成员。所以内部类也就具有和成员变量、成员方法相同的性质。比如,成员方法可以访问私有变量,那么成员类也可以访问私有变量了。也就是说,成员类中的成员方法都可以访问成员类所在类的私有变量。内部类最重要的特点就是能够访问外部类的所有成员

MVC模式

JTABLE

用JTable可以以表格的形式显示和编辑数据,JTable类的对象并不存储数据,它是数据的表现,data。
那么接下来就是要来实现如何存储数据了
首先创建一个接口类,并且初始化:

package kcb;

import javax.swing.event.TableModelListener;
import javax.swing.table.TableModel;

public class KcbData implements TableModel {

	@Override
	public int getRowCount() 
	{
		// TODO Auto-generated method stub
		return 0;
	}

	@Override
	public int getColumnCount()
	{
		// TODO Auto-generated method stub
		return 0;
	}

	@Override
	public String getColumnName(int columnIndex) 
	{
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public Class<?> getColumnClass(int columnIndex) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public boolean isCellEditable(int rowIndex, int columnIndex) 
	{
		// TODO Auto-generated method stub
		return false;
	}

	@Override
	public Object getValueAt(int rowIndex, int columnIndex)
	{
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public void setValueAt(Object aValue, int rowIndex, int columnIndex)
	{
		// TODO Auto-generated method stub

	}

	@Override
	public void addTableModelListener(TableModelListener l)
	{
		// TODO Auto-generated method stub

	}

	@Override
	public void removeTableModelListener(TableModelListener l)
	{
		// TODO Auto-generated method stub

	}

}

在设置之后

package kcb;

import javax.swing.event.TableModelListener;
import javax.swing.table.TableModel;

public class KcbData implements TableModel
{
	private String[] Strings= 
	{
			"周一","周二","周三","周四","周五","周六","周日"
	};
	
	private String[][]  data =new String[8][7];
	
	public KcbData() 
	{
		for(int i=0;i<data.length;i++)
		{
			for(int j=0;j<data[i].length;j++)
			{
				data[i][j]="";
			}
		}
	}
	
	@Override
	public int getRowCount()
	{
		return 8;
	}

	@Override
	public int getColumnCount()
	{
		return 7;
	}

	@Override
	public String getColumnName(int columnIndex) 
	{
		return Strings[columnIndex];
	}

	@Override
	public Class<?> getColumnClass(int columnIndex) 
	{
		return String.class;	
	}

	@Override
	public boolean isCellEditable(int rowIndex, int columnIndex) 
	{
		return true;
	}

	@Override
	public Object getValueAt(int rowIndex, int columnIndex)
	{
		return (data[rowIndex][columnIndex]);
	}

	@Override
	public void setValueAt(Object aValue, int rowIndex, int columnIndex)
	{
		data[rowIndex][columnIndex]=(String)aValue;
	}

	@Override
	public void addTableModelListener(TableModelListener l)
	{
		
	}

	@Override
	public void removeTableModelListener(TableModelListener l)
	{
		// TODO Auto-generated method stub

	}

}

package kcb;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;

public class JtableDemo
{
	public static void main(String string[])
	{
		JFrame frame = new JFrame();
		JTable table =new JTable(new KcbData());
		JScrollPane pane=new JScrollPane(table);
		frame.add(pane);
		frame.pack();
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setVisible(true);
	}
	
}

那么在上面所实现的这个TableDemo,是如下图这样的模式
在这里插入图片描述
在之前学习THINKPHP的框架的时候就学过这样的东西,只是那时候是盲学,现在可以有更为清晰的认识。

MVC详解

①数据、表现、控制三者分离,各自负责。
②M=model(模型) V=View(表现) C=Control(控制)
③模型:保存和维护数据,提供接口让外部修改数据,通知表现需要刷新
④表现:从模型获得数据,根据数据画出表现
⑤控制:从用户得到输入,根据输入调整数据
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值