1. 轻量 Swing 组件把它们的界面样式 (look and feel) 交给一个 UI 代表来处理,这个 UI 代表负责绘制组件(即 look )并处理组件的事件(即 feel) 。
2. 一个 Swing 组件绘画的过程 :JComponent.repaint()- à JComponent.paint() à UI.update()
à UI.paint();
3. UI 只负责绘画组件自身,组件类负责绘制组件的边框和组件的子组件。
5.Model 改变后,怎样通知视图改变
<1> 组件在初始化 Model 时,为 Model 注册监听器,在初始化 UI 时,为组件注册监听器监听器 , 当 Model 变化时,调用组件上面的监听器,组件上面的监听器调用 UI 上面注册的监听器, UI 上面为组件注册的监听器调用 JComponent.repaint() ,来及时反映 Model 的变化 .
<2> 组件在初始化 UI 时,在 UI 内部取得组件的 Model, 替 Model 注册监听器,当 Model 变化时,调用在 UT 中替 Model 注册的监听器,调用 JComponent.repaint();
两种通知视图的比较:其实都是通过监听器来调用 JComponent.repaint() 来及时更新视图,不同的地方时,注册 Model 监听器的地方不同, <1> 是在组件内部 .<2> 是在 UI 内部 .
6.Swing 组件 通过提供传模型传递方法和通过传送模型事件,组件还使它们的模型对开发人员透明。
1. 模型传递方法
Swing 组件为它们的模型提供传递方法,以便开发人员不需要直接访问模型来修改或查询状态。例如,下面列出的JSlider 类的方法显示了滑杆是如何传递它们模型的最小值的。
//From JSlider.java ,pass-through model methods;
public int getMinimum(){
return getModel().getMinimum();
}
public void setMinimum(int minimum){
int oldMin = getModel().getMinimum() ;
getModel().setMinimum(minimum);
firePropertyChange(" minimum",
new Intger(oldMin),new Integer(minimum));
}
JSlider.setMinimum() 在设置最小值后激发一个属性变化事件。组件模型的所有属性( 一个滑杆的最小值和最大值) 都应该激发属性变化事件。
2. 传送模型事件
Swing 组件还把模型事件传送给一个已向组件登记过的监听器。例如,一个滑杆作为一个变化监听器向其模型登记。当这个滑杆的模型激发了一个变化事件时,这个滑杆接着把一个变化事件发送给自己的变化监听器。JSlider 类实现一个变化监听器,它只把一个状态变化事件发送给滑杆的变化监听器。与组件UI 一样,JSlider 等组件类常常在内部类中封装事件处理。
下面列出了大大简化了的JSlider 类进行监听的代码,其中说明了滑杆把状态变化发送给它们的监听器以响应模型状态的变化的方法(与其他Swing 组件类的处理方法类似)。
//From JSlider.java:
public class JSlider extends JComponent
implements SwingConstants,Accessible{
...
protected ChangeListener changeListener=
createChangeListener();
...
public JSlider(int orientation,int min,
int max,int value){
...
sliderModel.addChangeListener(changeListener);
...
}
public void addChangeListener(ChangeListener l){
listenerList.add(ChangeListener,class,l);
}
public void removeChangeListener(changeListener l){
listenerList.remove(Change Listener.class,l);
}
...
protected ChangeListener createChangeListener(){
retrun new ModelListener();
}
...
private class ModelListener
implements ChangeLister,Serializable{
public void stateChaged(ChangeEvent e){
//fire event to change listener registered
//with addChageListener() listed above
fireStateChanged();
}
}
}
7. 组件监听其模型,其主要目的是把事件传送给已向组件登记过的监听器。组件还为模型属性提供传递方法。传送模型事件和提供模型属性的传递方法减少了直接访问组件模型的需要。
UI 代表监听器主要监听组件,有时也直接监听组件的模型。UI 代表对组件和模型变化的响应通常是更新它们的外观,这通常要访问组件或模型,以便获得有关变化的更多信息。
8. 轻量事件通知,状态通知,属性变化通知
1. 模型事件
模型具有激发大量事件的潜能。例如,当一个滑杆的滑块拖动时,该滑杆的模型激发一个连续不断的事件流,指示这个滑杆的值正在改变。因此,从性能方面来看,模型为每个激发的事件创建一个事件不总是实现的。
为了大大减少由一个模型创建的事件对象的数量,模型激发一个由javax.swing.event.ChangeEvent 类定义的特殊事件类型。变化事件与大多数其他事件不同,因为它们仅包含事件源这一种信息。这样,每个模型可以对所有的变化通知重复使用一个变化事件。
<1> 激发变化事件称为轻量通知,因为很少的信息与事件有关。激发其他的事件(例如,由按钮激发的动作事件)称为状态通知,因为该事件除包含事件之外还包含许多状态信息。
轻量通知用于要经常修改的模型属性。监听轻量通知的监听器(指实现ChangeListener 接口的监听器)询问从变化事件获得的事件源,以了解与变化有关的更多信息。
<2> 对很少变化的模型属性则使用状态通知。例如,从一个列表模型中删除一个元素产生一个状态通知,该通知包括删除行的索引值。
<3> 属性变化通知
当模型的关联属性变化时(当一个属性的变化激发一个属性变化事件,则这个属性称作关联属性。)模型会以一个java.beans.PropertyChangeEvent 的形式产生状态通知。属性变化通知由一些对象来处理,这些对象的类实现java.beans.PropertyChangeListener 接口
9. swing 对于MVC 的实现用一句话来说就是:一个GUI 组件对应着一个MVC 体系