`
helpbs
  • 浏览: 1161914 次
文章分类
社区版块
存档分类
最新评论

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

 
阅读更多

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

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

swing_2_4

使用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并不需要包装变化。


分享到:
评论

相关推荐

    Java Swing'组件集合

    关于swing组件的集合,刚刚接触这些的朋友看看,对swing组件有些了解

    经典Swing事例集合

    很多Swing经典事例,包扩各种组件、容器例子

    RComponent.Swing

    RComponent.Swing是RComponent为java开发人员提供的表现层Swing组件集合,100%java实现。提供完整的API,帮助文档。 丰富的Demo和Demo源码。提供免费技术支持。 1.RDatePicker 输入日期数据。 2.RIpAddressField ...

    JAVA教学(关于swing的使用)

    Swing是AWT的扩展,它提供了更强大和更灵活的组件集合。 除了我们已经熟悉的组件如按钮、 复选框和标签外, Swing还包括许多新的组件, 如选项板、 滚动窗口、树、表格。许多一些开发人员已经熟悉的组件,如按钮,在...

    swing-js:轻量级JavaScript组件的集合

    Swing.js是一个轻量级的javascript组件集合,可帮助减少对肿的第三方库的需求。 它的主要目标是: 尽可能减小文件大小。 允许独立加载组件(仅加载所需的组件)。 允许以任何顺序加载组件。 支持所有现代浏览器...

    JAVA Swing 全教程

    Swing包含250多个类,是组件和支持类的集合。Swing提供了40多个组件,是AWT组件的四倍。除提供替代AWT重量组件的轻量组件外,Swing还提供了大量有助于开发图形用户界面的附加组件。

    swing-material:Swing的材料设计组件和实用程序的集合

    摇摆材料Swing的材料设计组件和实用程序的集合。

    Java 界面组件案例集合 众多DEMO

    Java 界面组件案例集合 众多DEMO 适合新手和想学习java 界面开发的朋友使用

    基于集合的学生信息管理系统(含GUI)JAVA版

    是基于集合的学生信息管理系统,因此在批量处理信息时采用集合类对象来储存,本题采用的是ArrayList。 该系统有三大功能,分别是管理员、老师、学生。 管理员除了要实现自己的登录、查看个人信息和修改教师密码以外...

    Java项目实训+推箱子游戏2023版

    3.Swing组件的灵活应用; 4.IO流的应用,读取地图文件,解析地图内容; 5.音频文件的播放,实训播放背景音乐功能; 6.java事件的应用,如ActionListener,ItemListener等事件; 7.内部类的应用。 8.绘图功能的的灵活...

    AWT基础知识

    2. 事件处理模型 3. 图形图像工具(形状、颜色、字体) 4. 布局管理器 AWT的优势: 1. 最早的JAVA GUI包,内嵌到JDK中,无需引入其他类,功能稳定 2. AWT组件都是线程安全的 3. 界面编程基础. 学会AWT, 很容易去学...

    javaswing程序源码-java-book:《Java编程:综合入门》一书的源代码

    编程进行概述,阐述组件、事件、布局管理器的基本概念,然后依次对 Swing 组件、菜单、对话框、绘图等进行介绍。 第三部分(第22~27章)探究 Java API 库的部分内容,其中包括 java.lang 包和 java.util 包的大部分...

    OpenSwing---Java 常用控件集合

    对几乎所有的组件全部加入了JavaBeans处理, 使OpenSwing支持可视开发. 2005/04/17 将JNumberField最大长度,小数位长度修正成符合数据库定义的规范,如:NUMBER(10,2) 2005/04/21 修改了JNumberField的参数方式及不能...

    j2sePPT教案与事例

    包括OOP概述、java语言概述、JAVA编程基础、类和对象、类的高级特性6、字符与字符串7、数组8、断言9、异常和垃圾收集10、内部类11、反射12、gui编程13、swing结构与布局管理器14、AWT事件模型15、swing用户界面组件...

    个人简易版坦克大战,能保存数据,但没音效

    java基础,使用一些Swing组件,线程,集合

    Java综合实验---学生信息管理系统

    5) 使用迭代器遍历集合并输出集合的元素,将排序后输出的结果写入out.txt文件中,IO操作需要有异常处理; 例如:定义学生父类和不同阶段学生子类(本科生、研究生等),包含学生信息(学号、姓名、成绩或年龄等),...

    java从入门到精通视频教程(全94讲)学习笔记整理(齐全).docx

    坦克大战,简易QQ界面......P1第1讲-内容介绍....-事件处理.坦克大战3 -事件监听.坦克大战4 -事件总结.坦克大战5 -线程.坦克大战6 -线程.坦克大战7 -线程 -坦克大战8 -坦克大战9 -io编程.坦克大战10 -io编程

    tomproject:有用的Java组件和算法的集合

    它收集了来自本方和第三方作者的有用的Java组件和算法。 该项目的大部分致力于但不限于Java SE Desktop社区。 这些算法包括桌面应用程序内存管理器,Swing实用程序,Swing接口转换以及许多Swing的组件扩展。 ...

    JAVA学习手册CHM版

    本书以初学者为核心,全面介绍了使用Java进行程序开发的各种...第3篇为高级篇,包括Swing基础知识、JDBC技术、Swing高级组件、GUI事件处理机制、网络程序设计;第4篇为实战篇,包括进销存管理系统、 企业内部通信系统。

    java 核心技术卷一 光盘 资料

    这是一个txt文件,迅雷下载地址,复制,新建,下载就可以了 ...第8章 事件处理 第9章 Swing用户界面组件 第10章 部署应用程序和applet 第11章 异常、日志、断言和调试 第12章 泛型程序设计 第13章 集合 第14章 多线程

Global site tag (gtag.js) - Google Analytics