轻量级通知
下面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框架是Java GUI开发中的一个重要部分,它是建立在AWT(Abstract Window Toolkit)之上,提供了更丰富的组件和更现代的用户界面。Swing使用Java2D API来绘制组件,确保了平台独立性,使得在不同操作系统上都能...
Swing组件基于MVC(Model-View-Controller)设计模式,允许开发者分离数据模型、视图显示和用户交互逻辑。例如,JTable组件的模型可以独立于其显示和用户交互进行管理。 2. **容器与布局管理器**: 容器(如...
Java Swing的MVC(Model-View-Controller)模式是一种用于构建用户界面的软件设计模式,尤其在GUI(图形用户界面)开发中广泛应用。MVC模式将应用程序分为三个主要部分:模型(Model)、视图(View)和控制器...
【标题】"仿淘宝 无报错java swing ssh 框架源代码" 提供的是一款基于Java Swing和SSH框架开发的电子商务系统源码,该系统旨在模仿淘宝网的功能和界面,为学习和实践Java后端开发的用户提供了一个实际的项目案例。...
- **Swing概述**:Swing是Java中用于构建GUI应用程序的一个轻量级组件库,它是建立在AWT基础之上的一个高级框架。Swing组件不仅提供了更丰富的功能,而且在不同操作系统上具有一致的表现形式,这主要得益于Swing采用...
在Java Swing中实现MVC设计模式的知识点涉及软件设计原则、编程范式以及Swing框架的具体应用。MVC(Model-View-Controller)设计模式是一种将数据表示和数据处理分离的架构,目的是让开发者能够独立开发和维护数据...
Swing MVC(Model-View-Controller)是一种设计模式,它被广泛应用于图形用户界面(GUI)开发,包括Java Swing框架。在Swing中,MVC模式帮助开发者将应用程序的逻辑分解为三个相互独立的部分,从而提高代码的可读性...
这是一个基于Java Swing框架开发的简易商城系统项目,旨在帮助初学者理解如何将数据库技术与图形用户界面(GUI)相结合,创建一个实际的应用程序。在这个项目中,MySQL被用作后台数据库,Eclipse作为开发环境,Java ...
【标题】"基于Spring,MyBatis的JavaSwing记账小程序"是一个综合性的Java应用程序,它结合了三个核心的技术栈:Spring框架、MyBatis持久层框架以及Java Swing GUI库,用于创建一个用户友好的桌面记账工具。...
#### 二、MVC架构概述 MVC架构模式的核心在于将应用程序分为三个相互独立的部分:模型(Model)、视图(View)和控制器(Controller)。这种分离有助于保持代码清晰、易于维护,并支持更灵活的设计。 - **模型...
群聊功能。使用java swing,socket,...2) 实现服务器端与客户端的分离,如果要操作数据库,可以在服务器端改代码调用Model。 3) 实现用户上线/下线,客户端接收到服务器端发送的消息。 注意:压缩包内有运行效果图。
#### 二、Swing框架介绍 - **定义**: Swing是Java平台上的一套用于构建GUI(图形用户界面)的应用程序框架,是Java标准版(Java SE)的一部分。 - **功能**: Swing提供了丰富的组件库,允许开发者通过这些组件快速...
2. **MVC模式**:Model-View-Controller模式是一种软件设计模式,用于分离业务逻辑、数据模型和用户界面。在Swing应用中,模型通常处理数据的读取和写入,视图负责显示数据,而控制器接收用户输入并调用模型和视图...
JavaSwing+MyBatis简单学生管理系统是一款基于Java桌面应用技术与持久层框架MyBatis构建的信息管理软件。这个系统的主要目标是实现对学生信息的有效存储、检索和管理,适用于教育机构或个人学习使用。开发环境为Java...
通过阅读提供的文档“java.swing.doc”、查看演示文稿“Java_-_swing.ppt”和“java_之_Swing_图形用户界面.ppt”,你可以更深入地了解这些概念,并学会如何在实践中应用Java Swing进行GUI开发。这些资源将帮助你...
此外,Swing还提供了JFrame、JDialog、JOptionPane等窗口类,帮助开发者构建完整的应用程序框架。 总之,Swing 入门资料整理文档是一份全面的指南,通过实例教学,帮助初学者快速上手并掌握Swing的基本用法。通过...
《Java 2 图形设计卷Ⅱ:SWING》是一本深入探讨Java图形用户界面(GUI)编程的专业书籍,主要聚焦于SWING框架。在Java世界中,SWING是用于构建桌面应用程序的重要库,它提供了丰富的组件和功能,使得开发者能够创建...
2. **容器与布局管理器**: Swing 使用容器来组织组件,如 JFrame,JPanel 和 JDialog。每个容器都有默认的布局管理器,如 FlowLayout,GridLayout,BorderLayout,BoxLayout 和 CardLayout,用于决定组件在容器内的...
此外,`JLabel`还支持文本与图标的同时显示,以及文本的对齐方式调整,使其成为Swing应用程序中不可或缺的组件之一。 #### 结论 Swing作为一个成熟的GUI工具包,为Java开发者提供了构建高质量桌面应用程序所需的...