`
mylxiaoyi
  • 浏览: 327575 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

[翻译]Swing组件集合的事件处理(三)

    博客分类:
  • Java
阅读更多

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

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

swing_2_4

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

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

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

  1. /**
     * 
     */
    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'组件集合

    本篇文章将深入探讨Java Swing组件集合,帮助初学者更好地理解和使用这些组件。 首先,Swing 提供了丰富的组件集,包括按钮(JButton)、文本框(JTextField)、标签(JLabel)、复选框(JCheckBox)、单选按钮...

    swing控件及事件

    Swing是Java Foundation Classes (JFC)的一部分,提供了丰富的组件集合,用于创建美观且功能强大的图形用户界面。其中,一些常见的Swing控件包括: 1. **JFrame**:作为窗口的基础,它是所有Swing应用的起点。在...

    Java Swing 组件全演示

    它提供了丰富的组件集合,使得开发者可以创建复杂的、交互式的用户界面。在Java Swing组件全演示中,我们将深入探讨Swing的核心概念、组件和设计原则。 首先,Swing是基于AWT(Abstract Window Toolkit)的,但提供...

    swing组件的详细介绍

    1. **元件多样性**:Swing提供了比AWT更丰富的组件集合,包括树状视图(Treeviews)、图片按钮等,让开发者能创建更为复杂的用户界面。 2. **跨平台一致性**:Swing组件是轻量级的,它们不依赖于底层操作系统,从而...

    几个漂亮的SWING组件(源代码)

    Java Swing 是Java GUI(图形用户界面...总的来说,通过研究这些源代码,开发者不仅可以学习到Swing组件的基本使用,还能了解到组件的定制、交互处理和界面设计的技巧,这对于提升Java桌面应用开发技能是非常有帮助的。

    Swing 组件大全

    Swing组件大全是一个深入探讨Java Swing库的资源,它涵盖了Swing提供的所有主要组件,同时结合了数据库操作和第三方库jxl以及TableLayout布局管理器的使用。Swing是Java AWT(Abstract Window Toolkit)的扩展,提供...

    swing资料集合

    这本书可能包括Swing的基础知识,如组件、布局管理和事件处理,以及更高级的主题,如Swing的模型组件,如JTable和JList的使用,以及Swing的模态对话框、工具栏和状态栏的创建。此外,还可能涉及Swing的国际化和无...

    java swing组件例子

    通过深入学习和实践这个"java swing组件例子",你将能够熟练掌握如何使用Java Swing创建功能丰富的GUI应用程序,理解组件间的交互、事件处理机制以及布局管理的重要性和用法。同时,还能了解到如何通过自定义外观和...

    基于java的开源的Swing组件 JIDE.zip

    Java Swing组件库JIDE是一个强大的开发工具,专为Java开发者设计,用于构建功能丰富的桌面应用程序。JIDE提供了许多预构建的、高度可定制的Swing组件,极大地扩展了标准Java Swing的功能。这个开源项目旨在简化GUI...

    经典Swing事例集合

    11. **Event Handling**: Swing事件处理是基于Java的事件模型,可以通过实现Listener接口或使用匿名内部类来处理各种用户交互事件,如鼠标点击、键盘输入等。 12. **LookAndFeel**: Swing支持可定制的外观和感觉,...

    Java Swing 组件全演示源代码.rar_java swing_java 组件_java swing_java源代码_

    Java Swing 是Java GUI(图形用户界面)开发的重要库,它提供了丰富的组件集合,用于构建桌面应用程序。本资源“Java Swing 组件全演示源代码”包含了Java Swing中的各种组件的完整示例代码,可以帮助开发者深入理解...

    JAVA Swing常用组件

    在学习和使用Swing组件时,了解每个组件的属性、方法和事件处理机制非常重要。通过实例代码和案例分析,你可以更好地掌握如何创建功能丰富的桌面应用程序。提供的"Swing常用组件"资源很可能是包含各种示例代码的集合...

    Swing组件介绍(非常全)

    它是Java Foundation Classes (JFC) 的一部分,提供了一套丰富的组件集合,用于构建功能完善的用户界面。Swing在早期是为了弥补Java AWT(Abstract Window Toolkit)的不足而设计的,提供了更丰富的功能、更好的可...

    java-swing 实例集合及其源码

    通过分析这些实例,开发者可以深入理解Swing组件的使用、事件处理机制、自定义绘制方法以及如何将它们结合到实际项目中。这些源码实例为初学者提供了宝贵的实践资料,同时也为经验丰富的开发者提供了灵感和参考。

    jfc+swing—java基础类组件集

    三、Swing 事件处理: Swing 使用事件监听器模式来处理用户交互。开发者可以注册监听器对象到组件上,当特定事件发生时,监听器会接收到通知并执行相应的处理方法。例如,ActionListener 可用于处理按钮点击事件。 ...

    java使用swing组件编写的简易计算器

    总的来说,这个"java使用swing组件编写的简易计算器"项目涵盖了Java GUI编程的基础,包括Swing组件的使用、事件处理、基本计算逻辑实现以及IDE的使用。通过这个项目,开发者可以深入理解Java Swing的原理和实践,...

    SWING资料大集合

    - **Java Desktop.org**:这个网站提供了大量的Swing组件集合和示例代码,对于开发者来说是一个不错的资源库。 - **ChinaJavaWorld论坛**:这个中文论坛也有关于Swing的讨论和技术交流,适合中文读者。 ### 性能...

    基于Swing组件编写华容道Java程序

    在本项目中,“基于Swing组件编写华容道...它不仅展示了Swing组件的使用,还涵盖了图形用户界面设计、事件处理、数据结构以及算法应用等多个IT领域的知识。这样的项目对于学习和提升Java GUI编程能力是非常有价值的。

    Swing组件+MySQL销售管理系统_java系统_swing系统mysql_java.zip

    首先,Swing是Java的标准GUI库,它提供了丰富的组件集合,如按钮、文本框、表格、菜单等,用于构建美观且功能强大的桌面应用。在销售管理系统中,Swing组件可以用来创建用户友好的界面,让用户能够方便地输入、查看...

    SWING—JAVA 基础类组件集

    标题和描述中提到的知识点是关于Java...总结来说,Swing是一个全面的用户界面工具包,它通过Java语言的纯粹性,提供了一套跨平台、模块化的用户界面组件集合。开发者利用Swing可以创建功能强大、界面美观的应用程序。

Global site tag (gtag.js) - Google Analytics