第2章探讨了如何处理Swing组件的事件生产者与消费者。我们了解了Swing组件的事件处理如何超出原始的AWT组件的事件处理功能。在本章中,我们会进一步深入Swing组件设计,来探讨称之为Model-View-Controller(MVC)的体系地构。
3.1 理解MVC流
在1980年后首次被引入Smalltalk后,MVC体系结构是第2章所描述的观察者模式的一种特殊形式。MVC的模型部分存放组件的状态,并且用作Subject。MVC的视图部分用作Subject的观察者来显示模型状态。视图创建控制器,其中定义了用户界面如何响应用户输入。
3.1.1 MVC通信
图3-1显示MVC元素如何进行通信-在这种情况下,使用Swing的多行文本组件JTextArea。由MVC的角度来看,JTextArea作为MVC体系结构中的视图部分。显示在组件内部的是一个Document,他是JTextArea的模型。Document存放JTextArea的状态信息,例如文本内容。在JTextArea内部是一个InputMap格式的控制器。他将键盘输入映射为ActionMap中的命令,并且这些命令被映射到可以通知Document的TextAction对象。当发生通知时,Document创建一个DocumentEvent并将其发送回JTextArea。
3.1.2 Swing组件的UI委托
这个例子演示了Swing世界中MVC体系结构的一个重要方面。在视图与控制器之间需要发生复杂的交互。Swing设计将这两个元素组合为一个委托对象来简化设计。这导致了每一个Swing组件具有一个负责渲染当前组件状态并处理用户输入事件的UI委托。
有时,用户事件会导致不影响模型的视图改变。例如,当标位置是视图的一个属性。模型并不关心光标位置,只关心文本内容。影响光标位置的用户输入并不会传递给模型。相反,影响Document内容的用户输入(例如按下回退键)会被传递。按下回退键会导致由模型中移除一个字符。正是由于这种结合,每一个Swing组件具有一个UI委托。
为了演示,图3-2显示了具有模型与UI委托的JTextArea组成。用于JTextArea的UI委托由TextUI接口开始,并在BasicTextUI中进行基本实现。相应的,由用于JTextArea的BasicTextAreaUI进行特例化。BasicTextAreaUI创建一个视图,或者是一个PlainView或者是一个WrappedPlainView。在模型一侧,事情则要相对简单得多。Document接口由AbstractDocument类来实现,然后由PlainDocument进行具体化。
文本组件将会在第15章与第16章进行更为全面的解释。正如图3-2所示,文本组件的使用涉及到许多内容。在大多数情况下,我们并不需要处理到图中所示的程度。然而,所有这些类都是在幕后进行作用的。MVC体系结构的UI委托部分将会在第20章我们如何自定义委托时再进行深入的讨论。
3.2 共享数据模型
因为数据模型只存储状态信息,我们可以在多个组件之间共享模型。然后每一个组件视图可以用来修改模型。
在图3-3所示的情况中,三个不同的JTextArea组件可以用来修改一个Document模型。如果用户修改了一个JTextArea的内容,模型就会发生变化,使得其他的文本区域自动的反映更新的文档状态。对于任意的Document视图并没有必须手动通知其他的视图共享模型。
数据模型的共享可以通过下面两种方法来实现:
- 我们可以创建与任意组件相分离的数据模型并通知所有的组件使用这个数据模型。
- 我们可以先创建一个组件,由第一个组件获取模型,然后与其他的组件进行共享。
package swingstudy.ch03;
import java.awt.Container;
import java.awt.EventQueue;
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.text.Document;
public class ShareModel {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Runnable runner = new Runnable() {
public void run() {
JFrame frame = new JFrame("Share Sample");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container content = frame.getContentPane();
JTextArea textarea1 = new JTextArea();
Document document = textarea1.getDocument();
JTextArea textarea2 = new JTextArea(document);
JTextArea textarea3 = new JTextArea(document);
content.setLayout(new BoxLayout(content, BoxLayout.Y_AXIS));
content.add(new JScrollPane(textarea1));
content.add(new JScrollPane(textarea2));
content.add(new JScrollPane(textarea3));
frame.setSize(300, 400);
frame.setVisible(true);
}
};
EventQueue.invokeLater(runner);
}
}
图3-4显示了在编辑共享文档之后程序的样子。注意,三个文本区域具有查看(或是修改)文档不同部分的功能。例如,他们并不会只限于只在末尾部添加文本。这是因为每一个文本区域都会分别管理位置与光标。位置与光标是视图的属性,而不是模型的属性。
3.3 理解预定义的数据模型
当使用Swing组件时,理解每一个组件后面的数据模型是有益的,因为数据模型存储他们的状态。理解每一个组件的数据模型有助于我们将可见的组件(视图部分)与其逻辑(数据模型部分)相分离。例如,理解了这种分离,我们就会明白为什么JTextArea内部的光标位置不是数据模型部分,而是视图部分。
表3-1提供了一份Swing组件,每一个组件描述数据模型的接口以及特定实现的完整列表。如果某个组件并没有列出来,则该组件由其父类继承了数据模型,如AbstractButton。另外,在某些情况下,多个接口会用来描述一个组件,因为数据存储在一个模型中,而数据的选择是在另一个模型中。例如JComboBox,MutableComboBoxModel接口由ComboBoxModel扩展而来。预定义的类不仅实现了ComboBoxModel接口,同时也实现了MutableComboBoxModel接口。
Swing组件模型
组件
|
数据模型接口
|
实现 |
AbstractButton
|
ButtonModel
|
DefaultButtonModel |
JColorChooser
|
ColorSelectionModel
|
DefaultColorSelectionModel |
JComboBox
|
ComboBoxModel
MutableComboBoxModel
|
N/A
DefaultComboBoxModel |
JFileChooser
|
ListModel
|
BasicDirectoryModel |
JList
|
ListModel
ListSelectionModel
|
AbstractListModel
DefaultListModel
DefaultListSelectionModel |
JMenuBar
|
SingleSelectinModel
|
DefaultSingleSelectionModel |
JPopupMenu
|
SingleSelectionModel |
DefaultSingleSelectionModel |
JProgressBar
|
BoundedRangeModel
|
DefaultBoundedRangeModel
|
JScrollbar
|
BoundedRangeModel
|
DefaultBoundedRangeModel
|
JSlider
|
BoundedRangeModel
|
DefaultBoundedRangeModel |
JSpiner
|
SpinnerModel
|
AbstractionSpinnerModel
SpinnerDateModel
SpinnerListModel
SpinnerNumberModel
|
JTabbedPane
|
SingleSelectionModel
|
DefaultSingleSelectionModel
|
JTable
|
TableModel
TableColumnModel
ListSelectionModel
|
AbstractTableModel
DefaultTableModel
DefaultTableColumnModel
DefaultListSelectionModel
|
JTextComponent
|
Document
|
AbstractDocument
PlainDocument
StyledDocument
DefaultStyleDocument
HTMLDocument
|
JToggleButton
|
ButtonModel
|
JToggleButton
ToggleButtonModel
|
JTree
|
TreeModel
TreeSelectionModel
|
DefaultTreeModel
DefaultTreeSelectionModel
JTree.EmptySelectionModel
|
当直接访问一个组件的模型时,如果我们修改模型,所有注册的视图都会被自动通知。相应的,这会使得视图重新验证自身来保证组件显示他们的正确的当前状态。这种状态修改自动传播的特性也是为什么MVC如此流行的原因之一。另外,使用MVC体系结构有助于程序在随着时间与复杂性增长修改时变得更容易维护。如果我们改变可视组件库也不再需要担心丢失状态信息。
3.4 小结
本章提供了关于Swing组件如何使用修改的MVC体系结构的一个快速浏览。我们探讨了修改的MVC体系结构的构成以及一个特定的组件,JTextArea如何映射到这个体系结构。另外,本章讨论了在组件之间数据模型的共享并且列出了所有用于不同Swing组件的数据模型。
在第4章,我们将会开始了解构成Swing库的单个组件。另外,当我们检测Swing库中的基本JComponet组件时我们会探讨Swing组件类层次结构。
分享到:
相关推荐
J2EE的MVC体系结构及其设计模式,J2EE的MVC体系结构及其设计模式。
J2EE的MVC体系结构及其设计模式.doc
ppt 介绍mvc体系结构,百度文库上的是会员资源,下载了作为分享。如果没有积分但是有需求,可以私信,我会发给你的,留下邮箱就行
一个采用Java Swing和MySQL的桌面应用程序,具有MVC体系结构,并为学生、教师和管理员提供三个用户仪表板.zip
在分析MVC(Model/View/Controller)模式机理的基础上,给出了基于MVC的软件界面体系结构及其工作机理。软件界面体系结构带来了软件设计的灵活性和高度重用性。最后,以软件界面体系结构为指导,分析了MFC...
MVC全名是Model View Controller,是模型...而且界面和用户围绕数据的交互能被改进和个性化定制而不需要重新编写业务逻辑MVC被独特的发展起来用于映射传统的输入、处理和输出功能在一个逻辑的图形化用户界面的结构中。
把以前学习的东西做一个整理,方便实时查阅,希望大家能够喜欢。
模型-视图-控制(model-view-control,简称MVC)结构是目前最常见的J2EE应用所基于的体系结构,MVC主要适用于交互式的Web应用,尤其是存在大量页面及多次客户访问及数据显示;相比较而言,一个工作流体系结构更多应用...
本文主要讲解AngularJS MVC体系结构,这里提供详细的教程供大家学习参考,有需要的小伙伴可以参考下
这是我自己写的论文开题报告,中间参考一些来自网络的资源,总之,论文很顺利的通过了。
先决条件使学校做功课/ RAMP课程内容课程交付:在线| 7周14节课程学分:3学分| 37.5座位时间| 75小时总学习目标解释用于Web服务器开发的MVC体系结构。 使用资源丰富的路由并解释资源丰富的Web体系结构的重要性。 ...
安全在线银行应用在ASP.NET MVC体系结构中使用实体框架使用实体框架的ASP.NET MVC体系结构中的安全在线银行应用程序自述文件这是由Dinsmore和Sahai实施的OnlineBankning应用程序,该应用程序旨在在具有SQL Server...
一个基于Web的项目,它使用Java Servlet Pages和Java使用MVC体系结构方法以及MySQL作为后端,为邮轮活动协调系统开发,以实现自动化测试的概念和原则。 乘客可以报名参加活动。 事件协调员是负责协调特定事件的人员-...
mvc 软件体系结构model view controller
一个用jsf+servlect+dao实现的一个小的登入系统,体现出来mvc架构思想,在此存储一下以后备用
它遵循MVC体系结构。 功能包括:自动生成注册时的ID和密码转移请求管理:员工只有在成功服务一年后才能请求转移。所有用户都将获得一个视图(表格格式)以及其他功能,例如视图,更新,删除根据他们的角色
Source-code-generation:该项目在java的Spring Boot框架中生成任何形式的源代码。 它以可下载的格式生成定义良好的文件夹结构,以及MVC体系结构中的数据库的CRUD操作
1,学生注册后,题库中如果有试题,就可以参加考试 2,管理员增加科目,分配试题,增添新的试题 3,老师或管理员可以查看学生的信息,对试卷进行评分