MVC的概念
View做的事情是当被通知数据被修改了,就从Model获得数据把整个窗口重新画一遍。
Model做的事情是当数据修改了,Model会通知View数据被修改了,并提供给View数据。
Control会检测用户是否修改了数据,如在表格中输入了数据,如果数据被修改了,则调用Model提供的接口来修改Model中的数据。
在上面的设计模式种很重要的一点是View和Control是没有关系的,用户在界面上的操作不直接修改界面上的数据,而是要经过Model,由它来调用View重绘窗口,使数据显示在窗口中。
这样做的好处是每一个模块都很单纯,特别是View不用考虑如何重绘改变的数据,View会把所有数据都拿过来重绘一遍。
MVC实例
下面是一个课程表的代码:
KCB.java
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
public class KCB {
public static void main(String[] args) {
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);
}
}
KCBdata.java
import javax.swing.event.TableModelListener;
import javax.swing.table.TableModel;
public class KCBdata implements TableModel {
private String[] title= {
"周一", "周二", "周三", "周四", "周五", "周六", "周日"
};
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 title[columnIndex];
}
@Override
public Class<?> getColumnClass(int columnIndex) {
return String.class; //String.class会返回java.lang.String
//每一个.class文件被jvm加载后,会在jvm中创建一个类型为Class类型的对象来表示这份字节码,你可以
//通过类名. class获取这个Class类型的对象,例如String.class,也可以通过类对象.getClass()方法
//来获取,例如obj.getClass()
}
@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) {
// TODO 自动生成的方法存根
}
@Override
public void removeTableModelListener(TableModelListener l) {
// TODO 自动生成的方法存根
}
}
在这个实例中KCB.java(JTable)合并成为了View和Control的角色,KCBdata.java(TableModel)则是Model。
这是常见的一种做法,因为得到用户的输入(控制)本来就是在图形界面实现的,所以在图形界面表达界面的类中,它做了表现,同时也是它得到了用户的输入,又由它来控制Model,这和MVC并不矛盾,只是把View和Control结合起来了。