`

Swing框架之Model之二

阅读更多

Swing框架之Model之二

轻量级通知

       下面Swing中的模型使用轻量级通知,它们是基于 ChangeListener、ChangeEvent接口的:

Model Listener Event
BoundedRangeModel ChangeListener ChangeEvent
ButtonModel ChangeListener ChangeEvent
SingleSelectionModel ChangeListener ChangeEvent


      ChangeListener接口只有一个通用方法:

public void stateChanged(ChangeEvent e)

      ChangeEvent中仅有的状态是事件源,因为所有通知中 的事件源 都是相同的,单独一个事件实例可以用作所有来自该模型的通知。使用此机制的模型支持下面的方法来添加和删除ChangeListeners:

   public void addChangeListener(ChangeListenerl)
   public voidremoveChangeListener(ChangeListenerl)

        获知JSlider数据发生变化的代码可以使用如下代码实现:

JSlider slider = new JSlider();
BoundedRangeModelmodel =slider.getModel();           
model.addChangeListener(new ChangeListener() {
      public voidstateChanged(ChangeEvent e) {
            // need to query themodel
            // to getupdatedvalue...
            BoundedRangeModel m= (BoundedRangeModel)e.getSource();
            System.out.println("model changed: "+
            m.getValue());
      }
});

       为给不想和分离式模型交互的程序提供方便,一些Swing组件类提供了直接在组件上注册ChangeListener的方法(组件可在组件内部侦听模型的 数据变化,并将事件传播给任何注册在组件上的Listener),这些通知的唯一区别是,使用模型注册方式的事件源是该模型实例,而使用组件注册方式的事 件源是该组件。

        因此我们可以将前面的例子简化成:

JSlider slider = newJSlider();
slider.addChangeListener(new ChangeListener() {
     public void stateChanged(ChangeEvent e) {
           //the source will be
           // the slider this time..
           JSlider s=(JSlider)e.getSource();
           System.out.println("valuechanged: "+ s.getValue());
     }
});

状态化通知

       支持状态化通知的模型根据它们的目的提供不同的Listener接口和事件对象。下表是这些模型接口和事件对象的类:

Model Listener Event
ListModel ListDataListener ListDataEvent
ListSelectionModel ListSelectionListener ListSelectionEvent
ComboBoxModel ListDataListener ListDataEvent
TreeModel TreeModelListener TreeModelEvent
TreeSelectionModel TreeSelectionListener TreeSelectionEvent
TableModel TableModelListener TableModelEvent
TableColumnModel TableColumnModelListener TableColumnModelEvent
Document DocumentListener DocumentEvent
Document UndoableEditListener UndoableEditEvent

       Listener 除了 可以直接查询事件对象来跟踪内容 改变 外,这些API的作用与轻量级通知相似。比如下面的代码动态的跟踪JList被选中的项:

Stringitems[] = {"One", "Two", "Three");
JList list = new JList(items);
ListSelectionModel sModel =list.getSelectionModel();
sModel.addListSelectionListener (new ListSelectionListener() {
       publicvoidvalueChanged(ListSelectionEvent e) {
             // get change information directly
             // fromtheevent instance...
             if (!e.getValueIsAdjusting()) {
                  System.out.println("selection changed: " +
                  e.getFirstIndex());
             }
       }
});


自动视图更新

        模型没有任何表现它视图的固有知识,相反模型只有关心其状态改变的Listener列表,这种需求对于同个模型多个视图的框架来说是至关重要的。 Swing组件负责将合适的模型Listener连接起来,以便于模型改变时能正确地重画出自己。如果你发现模型改变时,组件不能自动更新,说明组件的实 现就存在错误。

忽略模型

        正如前面提到的,大多数组件直接在Component类中提供模型定义的API,以方便组件能不用和模型交互就直接操作,这是相当可行的编程方法,尤其是对于GUI状态模型来说。比如下面的JSlider内部getValue的实现,它将调用代理给模型:

public int getValue(){
      return getModel().getValue();
}

         因此程序完全可以这样写:

JSlider slider = new JSlider();
int value=slider.getValue();

Swing模型总结

         虽然理解了Swing模型设计是如何工作的,但没有必要在所有Swing编程中都使用模型API。你需要注意考虑应用程序各自的需求,决定哪儿使用模型API能帮你提升代码,且不带来不必要的复杂性。

         我特别推荐在Swing中使用应用数据模型(如JTable和JTree等的模型),因为从长期来看,它们能极大地提高你的应用程序可扩展性和模块化度。

分享到:
评论

相关推荐

    swing框架详细讲解

    Swing框架是Java GUI开发中的一个重要部分,它是建立在AWT(Abstract Window Toolkit)之上,提供了更丰富的组件和更现代的用户界面。Swing使用Java2D API来绘制组件,确保了平台独立性,使得在不同操作系统上都能...

    swing 应用框架 1.3 英文版 API

    Swing组件基于MVC(Model-View-Controller)设计模式,允许开发者分离数据模型、视图显示和用户交互逻辑。例如,JTable组件的模型可以独立于其显示和用户交互进行管理。 2. **容器与布局管理器**: 容器(如...

    java swing的mvc模式的简单框架

    Java Swing的MVC(Model-View-Controller)模式是一种用于构建用户界面的软件设计模式,尤其在GUI(图形用户界面)开发中广泛应用。MVC模式将应用程序分为三个主要部分:模型(Model)、视图(View)和控制器...

    仿淘宝 无报错java swing ssh 框架源代码

    【标题】"仿淘宝 无报错java swing ssh 框架源代码" 提供的是一款基于Java Swing和SSH框架开发的电子商务系统源码,该系统旨在模仿淘宝网的功能和界面,为学习和实践Java后端开发的用户提供了一个实际的项目案例。...

    在Java Swing中实现MVC设计模式(英文)

    在Java Swing中实现MVC设计模式的知识点涉及软件设计原则、编程范式以及Swing框架的具体应用。MVC(Model-View-Controller)设计模式是一种将数据表示和数据处理分离的架构,目的是让开发者能够独立开发和维护数据...

    Swing MVC 代码示例

    Swing MVC(Model-View-Controller)是一种设计模式,它被广泛应用于图形用户界面(GUI)开发,包括Java Swing框架。在Swing中,MVC模式帮助开发者将应用程序的逻辑分解为三个相互独立的部分,从而提高代码的可读性...

    简易商城系统,MySQL+eclipse (运用Java swing框架)

    这是一个基于Java Swing框架开发的简易商城系统项目,旨在帮助初学者理解如何将数据库技术与图形用户界面(GUI)相结合,创建一个实际的应用程序。在这个项目中,MySQL被用作后台数据库,Eclipse作为开发环境,Java ...

    基于spring,mybatis的JavaSwing记账小程序

    【标题】"基于Spring,MyBatis的JavaSwing记账小程序"是一个综合性的Java应用程序,它结合了三个核心的技术栈:Spring框架、MyBatis持久层框架以及Java Swing GUI库,用于创建一个用户友好的桌面记账工具。...

    Java-Swing-MVC使用

    #### 二、MVC架构概述 MVC架构模式的核心在于将应用程序分为三个相互独立的部分:模型(Model)、视图(View)和控制器(Controller)。这种分离有助于保持代码清晰、易于维护,并支持更灵活的设计。 - **模型...

    java swing实现群聊功能

    群聊功能。使用java swing,socket,...2) 实现服务器端与客户端的分离,如果要操作数据库,可以在服务器端改代码调用Model。 3) 实现用户上线/下线,客户端接收到服务器端发送的消息。 注意:压缩包内有运行效果图。

    swing初学者入门教程

    #### 二、Swing框架介绍 - **定义**: Swing是Java平台上的一套用于构建GUI(图形用户界面)的应用程序框架,是Java标准版(Java SE)的一部分。 - **功能**: Swing提供了丰富的组件库,允许开发者通过这些组件快速...

    swing宠物管理系统(有文档).rar

    2. **MVC模式**:Model-View-Controller模式是一种软件设计模式,用于分离业务逻辑、数据模型和用户界面。在Swing应用中,模型通常处理数据的读取和写入,视图负责显示数据,而控制器接收用户输入并调用模型和视图...

    javaSwing+mybatis 简单的学生管理系统

    JavaSwing+MyBatis简单学生管理系统是一款基于Java桌面应用技术与持久层框架MyBatis构建的信息管理软件。这个系统的主要目标是实现对学生信息的有效存储、检索和管理,适用于教育机构或个人学习使用。开发环境为Java...

    java swing基础教程

    通过阅读提供的文档“java.swing.doc”、查看演示文稿“Java_-_swing.ppt”和“java_之_Swing_图形用户界面.ppt”,你可以更深入地了解这些概念,并学会如何在实践中应用Java Swing进行GUI开发。这些资源将帮助你...

    Swing 入门资料整理文档

    此外,Swing还提供了JFrame、JDialog、JOptionPane等窗口类,帮助开发者构建完整的应用程序框架。 总之,Swing 入门资料整理文档是一份全面的指南,通过实例教学,帮助初学者快速上手并掌握Swing的基本用法。通过...

    SWING教程.pdf

    Swing采用了MVC(Model-View-Controller)设计模式,将数据模型、用户界面和用户交互逻辑分离,提高了代码的可维护性和可重用性。模型负责处理应用程序的数据逻辑,视图用于展示数据,而控制器则处理用户的输入,...

    Java 2 图形设计卷Ⅱ:SWING

    《Java 2 图形设计卷Ⅱ:SWING》是一本深入探讨Java图形用户界面(GUI)编程的专业书籍,主要聚焦于SWING框架。在Java世界中,SWING是用于构建桌面应用程序的重要库,它提供了丰富的组件和功能,使得开发者能够创建...

    swing 入门资料

    2. **容器与布局管理器**: Swing 使用容器来组织组件,如 JFrame,JPanel 和 JDialog。每个容器都有默认的布局管理器,如 FlowLayout,GridLayout,BorderLayout,BoxLayout 和 CardLayout,用于决定组件在容器内的...

    swing入门教程

    此外,`JLabel`还支持文本与图标的同时显示,以及文本的对齐方式调整,使其成为Swing应用程序中不可或缺的组件之一。 #### 结论 Swing作为一个成熟的GUI工具包,为Java开发者提供了构建高质量桌面应用程序所需的...

Global site tag (gtag.js) - Google Analytics