Swing小节1

来源:互联网 发布:室内装饰预算软件 编辑:程序博客网 时间:2024/06/03 21:32

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.javapass-throughmodel methods;
  public int getMinimum(){
    return getModel().getMinimum();
  }
  public void setMinimum(int minimum){
    int oldMin = getModel().getMinimum()
    getModel().setMinimum(minimum);
  firePropertyChange("minimum",
    new Intger(oldMin),newInteger(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体系

原创粉丝点击