在java编程中swing包中的组件处理事件时,swing的事件处理机制
2.2.2使用属性更改监听器作为观察器。
除了基本的事件委托机制,JavaBean还引入了观察者设计模式的另一种变体,这一次是通过属性更改监听器。PropertyChangeListener实现是observer模式的精确表示。每个观察者观察对象属性的变化。当主题发生变化时,观察者将被告知新的状态。图2-4显示了与JavaBean库中用于属性变更处理的特定类相关的观察者模式结构。在这种情况下,可观察主体有一个添加/删除属性更改监听器方法集和一个状态被监控的属性。
使用PropertyChangeListener,注册的侦听器集合在PropertyChangeSupport类中进行管理。当被监视的属性值改变时,这个支持类将通知所有注册的侦听器新的和旧的属性状态值。
通过向支持该侦听器类型的各种组件注册PropertyChangleListener对象,我们可以减少侦听器设置初始化后必须生成的代码量。例如,绑定Swing组件的背景色意味着您可以向组件注册一个PropertyChangeListener,并在背景设置更改时得到通知。当组件的背景属性值改变时,可以通知侦听器,以便观察者可以将其背景颜色设置为新的设置。因此,如果我们希望程序中的所有组件都有相同的背景颜色,我们可以将它们注册到一个组件中。然后,当该组件更改其背景色时,所有其他组件都将被通知这一更改,并且它们的背景将被修改为新的设置。
清单2-3中的程序演示了PropertyChangeListener的使用。他创造了两个按钮。当选择任何按钮时,所选按钮的背景将变为随机颜色值。第二个按钮侦听第一个按钮的属性更改。当第一个按钮的背景色发生变化时,第二个按钮的背景色也会修改为新值。第一个按钮不监视第二个按钮的属性更改,因此当第二个按钮被选中并更改其背景色时,此更改不会传播到第一个按钮。
/**
包swingstudy.ch02
导入Java . awt . borderlayout;
导入Java . awt . color;
导入Java . awt . event queue;
导入Java . awt . event . action event;
导入Java . awt . event . action listener;
导入Java . beans . propertychangeevent;
导入Java . beans . propertychangelister;
导入Java . util . random;
导入javax . swing . jbutton;
导入javax . swing . jframe;
* @作者联想
公共类按钮示例3 {
* @param args
公共静态void main(String[] args) {
//TODO自动生成的方法存根
Runnable runner=new Runnable() {
公共无效运行(){
JFrame frame=new JFrame(按钮示例);
frame . setdefaultcloseoperation(JFrame。EXIT _ ON _ CLOSE);
final JButton button 1=new JButton( Select Me );
final JButton button 2=new JButton( No Select Me );
最终Random Random=new Random();
action listener action listener=new action listener(){
public void action performed(action event事件){
JButton button=(JButton)event . getsource();
int red=random . nextint(255);
int green=random . nextint(255);
int blue=random . nextint(255);
button.setBackground(新颜色(红、绿、蓝));
propertychangelister propertychangelister=new propertychangelister(){
public void property change(PropertyChangeEvent事件){
string property=event . getpropertyname();
if(背景。等于(属性)){
button 2 . set background((Color)event . get new value());
button 1 . addactionlistener(action listener);
button 1 . addpropertychangelister(propertychangelister);
button 2 . addactionlistener(action listener);
frame.add(button1,BorderLayout。北);
frame.add(button2,BorderLayout。南);
frame.setSize(300,100);
frame . set visible(true);
event queue . invoke later(runner);
}
虽然这个例子只实现了按钮选择的一种颜色变化,但是想象一下,如果第一个按钮的背景颜色是由几百个不同的位置而不是一个动作监视器改变的。如果没有属性更改侦听器,这些位置中的每一个都需要更改第二个按钮的背景色。在属性更改监听器的帮助下,他只需要修改基本对象的背景颜色——在本例中是第一个按钮。那么这种变化将自动传播到其他组件。
Swing库还使用ChangeEvent/ChangeListener对来表示状态变化。虽然它类似于PropertyChangeEvent/propertychangelister对,但是ChangeEvent没有新的和旧的数据值设置。我们可以把它看作是属性更改监听器的轻量级版本。当多个属性值改变时,ChangeEvent会非常有用,因为ChangeEvent不需要包装。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。