Swing组件集合的事件处理(三)

Swing组件集合的事件处理(三),第1张

2.2.2 使用属性变化监听器作为观察者

除了基本的事件委托机制以外,JavaBean引入另一种观察者设计模式的变体,这次是通过属性变化监听器。PropertyChangeListener实现是观察者模式的确切表示。每一个观察者观察Subject的一个属性的变化。当Subject中发生变化时,观察者会被通知新的状态。图2-4显示了与JavaBean库中用于属性变化处理的特定类相关的观察者模式结构。在这种情况下,可观察的Subject具有一个add/remove属性变化监听器方法集合以及一个状态被监视的属性。

使用PropertyChangeListener,注册的监听器集合是在PropertyChangeSupport类中进行管理的。当监视的属性值变化时,这个支持类会通知所有的注册监听器新的以及旧的属性状态值。

通过向支持这种监听器类型的各种组件注册PropertyChangleListener对象,我们可以减少在初始化监听设置之后必须生成的代码量。例如,绑定Swing组件的背景颜色,意味着可以向组件注册一个PropertyChangeListener,当背景设置发生变化时就可以得到通知。当组件的背景属性值发生变化时,监听者就可以得到通知,从而可以使得观察者将其背景颜色设置为一个新的设置。所以,如果我们希望我们程序中的所有组件具有相同的背景颜色,我们可以将他们注册到一个组件。然后,当那个组件改变其背景颜色时,所有其他的组件都会被通知这种改变,并修改其背景为新的设置。

列表2-3中的程序演示了PropertyChangeListener的使用。他创建了两个按钮。当任意一个被选中时,被选中按钮的背景就会修改为一个随机的颜色值。第二个按钮监听第一个按钮的属性变化。当第一个按钮的背景颜色变化时,第二个按钮的背景颜色也会修改为新值。第一个按钮并没有监听第二个按钮的属性变化,所以当第二个按钮被选中并改变及背景颜色时,这种变化并不会传播到第一个按钮。

/**
 * 
 */
package swingstudy.ch02;
 
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.Random;
 
import javax.swing.JButton;
import javax.swing.JFrame;
 
/**
 * @author lenovo
 *
 */
public class ButtonSample3 {
 
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
 
		Runnable runner = new Runnable() {
			public void run() {
				JFrame frame = new JFrame("Button Sample");
				frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 
				final JButton button1 = new JButton("Select Me");
				final JButton button2 = new JButton("No Select Me");
 
				final Random random = new Random();
 
				ActionListener actionListener = new ActionListener(){
					public void actionPerformed(ActionEvent event) {
						JButton button = (JButton)event.getSource();
						int red = random.nextInt(255);
						int green = random.nextInt(255);
						int blue = random.nextInt(255);
						button.setBackground(new Color(red, green, blue));
					}
				};
 
				PropertyChangeListener propertyChangeListener = new PropertyChangeListener() {
					public void propertyChange(PropertyChangeEvent event) {
						String property = event.getPropertyName();
						if("background".equals(property)) {
							button2.setBackground((Color)event.getNewValue());
						}
					}
				};
 
				button1.addActionListener(actionListener);
				button1.addPropertyChangeListener(propertyChangeListener);
				button2.addActionListener(actionListener);
 
				frame.add(button1, BorderLayout.NORTH);
				frame.add(button2, BorderLayout.SOUTH);
				frame.setSize(300, 100);
				frame.setVisible(true);
			}
		};
 
		EventQueue.invokeLater(runner);
	}
 
}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/2083086.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-07-22
下一篇 2022-07-22

发表评论

登录后才能评论

评论列表(0条)

保存