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);
}
}
尽管这个例子只是实现了按钮选中中的一个颜色变化,想像一下,如果第一个按钮的背景颜色是由上百个不同位置变化的,而不是一个动作监听器。如果没有属性变化监听器,这些位置中的每一个都需要改变第二个按钮的背景颜色。借助于属性变化监听器,他只需要修改基本对象的背景颜色--在这种情况下是第一个按钮。然后这种变化会自动传播到其他的组件。
Swing库同时也会使用ChangeEvent/ChangeListener对来表示状态变化。尽管其与PropertyChangeEvent/PropertyChangeListener对相类似,但是ChangeEvent并不会带有新的以及旧的数据值设置。我们可以将其看作是属性变化监听器的一个轻量级版本。当多个属性值发生变化时ChangeEvent会非常有用,因为ChangeEvent并不需要包装变化。
分享到:
相关推荐
关于swing组件的集合,刚刚接触这些的朋友看看,对swing组件有些了解
很多Swing经典事例,包扩各种组件、容器例子
RComponent.Swing是RComponent为java开发人员提供的表现层Swing组件集合,100%java实现。提供完整的API,帮助文档。 丰富的Demo和Demo源码。提供免费技术支持。 1.RDatePicker 输入日期数据。 2.RIpAddressField ...
Swing是AWT的扩展,它提供了更强大和更灵活的组件集合。 除了我们已经熟悉的组件如按钮、 复选框和标签外, Swing还包括许多新的组件, 如选项板、 滚动窗口、树、表格。许多一些开发人员已经熟悉的组件,如按钮,在...
Swing.js是一个轻量级的javascript组件集合,可帮助减少对肿的第三方库的需求。 它的主要目标是: 尽可能减小文件大小。 允许独立加载组件(仅加载所需的组件)。 允许以任何顺序加载组件。 支持所有现代浏览器...
Swing包含250多个类,是组件和支持类的集合。Swing提供了40多个组件,是AWT组件的四倍。除提供替代AWT重量组件的轻量组件外,Swing还提供了大量有助于开发图形用户界面的附加组件。
摇摆材料Swing的材料设计组件和实用程序的集合。
Java 界面组件案例集合 众多DEMO 适合新手和想学习java 界面开发的朋友使用
是基于集合的学生信息管理系统,因此在批量处理信息时采用集合类对象来储存,本题采用的是ArrayList。 该系统有三大功能,分别是管理员、老师、学生。 管理员除了要实现自己的登录、查看个人信息和修改教师密码以外...
3.Swing组件的灵活应用; 4.IO流的应用,读取地图文件,解析地图内容; 5.音频文件的播放,实训播放背景音乐功能; 6.java事件的应用,如ActionListener,ItemListener等事件; 7.内部类的应用。 8.绘图功能的的灵活...
2. 事件处理模型 3. 图形图像工具(形状、颜色、字体) 4. 布局管理器 AWT的优势: 1. 最早的JAVA GUI包,内嵌到JDK中,无需引入其他类,功能稳定 2. AWT组件都是线程安全的 3. 界面编程基础. 学会AWT, 很容易去学...
编程进行概述,阐述组件、事件、布局管理器的基本概念,然后依次对 Swing 组件、菜单、对话框、绘图等进行介绍。 第三部分(第22~27章)探究 Java API 库的部分内容,其中包括 java.lang 包和 java.util 包的大部分...
对几乎所有的组件全部加入了JavaBeans处理, 使OpenSwing支持可视开发. 2005/04/17 将JNumberField最大长度,小数位长度修正成符合数据库定义的规范,如:NUMBER(10,2) 2005/04/21 修改了JNumberField的参数方式及不能...
包括OOP概述、java语言概述、JAVA编程基础、类和对象、类的高级特性6、字符与字符串7、数组8、断言9、异常和垃圾收集10、内部类11、反射12、gui编程13、swing结构与布局管理器14、AWT事件模型15、swing用户界面组件...
java基础,使用一些Swing组件,线程,集合
5) 使用迭代器遍历集合并输出集合的元素,将排序后输出的结果写入out.txt文件中,IO操作需要有异常处理; 例如:定义学生父类和不同阶段学生子类(本科生、研究生等),包含学生信息(学号、姓名、成绩或年龄等),...
坦克大战,简易QQ界面......P1第1讲-内容介绍....-事件处理.坦克大战3 -事件监听.坦克大战4 -事件总结.坦克大战5 -线程.坦克大战6 -线程.坦克大战7 -线程 -坦克大战8 -坦克大战9 -io编程.坦克大战10 -io编程
它收集了来自本方和第三方作者的有用的Java组件和算法。 该项目的大部分致力于但不限于Java SE Desktop社区。 这些算法包括桌面应用程序内存管理器,Swing实用程序,Swing接口转换以及许多Swing的组件扩展。 ...
本书以初学者为核心,全面介绍了使用Java进行程序开发的各种...第3篇为高级篇,包括Swing基础知识、JDBC技术、Swing高级组件、GUI事件处理机制、网络程序设计;第4篇为实战篇,包括进销存管理系统、 企业内部通信系统。
这是一个txt文件,迅雷下载地址,复制,新建,下载就可以了 ...第8章 事件处理 第9章 Swing用户界面组件 第10章 部署应用程序和applet 第11章 异常、日志、断言和调试 第12章 泛型程序设计 第13章 集合 第14章 多线程