11.1 Swing和模型-视图-控制器设计模式
构成用户界面组件得各个组成部门,如按钮,复选框,文本域,或复杂的树控件。每个组件都有三个特征:
- 内容,如,按钮的状态(是否按下),或者文本域中得文本
- 外观(颜色,大小等)。
- 行为(对事件的反应)
Swing设计者采用了一种很有名的设计模式:模型-视图-控制器模式。
这种设计模式要求我们提供三个不同的对象:
- 模型:存储内容
- 视图:显示内容
- 控制器:处理用户输入
这种设计模式明确规定了三个对象如何交互。
模型存储内容,它没有用户界面。
按钮的内容非常简单,只有很少的一组标志,用来表示按钮是否按下,是否处于活动状态等等。
文本域保存当前文本的一个字符串对象。如果内容的长度大于文本域的大小,用户就只能看到文本域可以现实的那一部分
== 模型必须实现改变内容和查找内容的方法==
模型是完全不可见的显示存储在模型中的数据是视图的工作。
在设计模式中,模型存储完整的内容,视图给出(完整的或者不完整的)可视化显示。
模型-视图-控制器模式的一个优点是,一个模型可以有多个视图,其中每个视图都可以显示全部内容的的不同部分或不同方面。
当通过某一个视图的控制器对模型进行更新时,模型会通知关联的两个视图发生了改变,视图得到通知后会自动的刷新
控制器负责处理用户输入事件,如点击鼠标和按键。然后决定是否把这些事件转化为模型或视图的更改。
例如一个文本框中按下了一个字符键,控制器用模型的“插入字符”的命令,然后模型告诉试图进行更新,而试图永远不会知道文本为什么改变了。但是如果用户按下了一个箭头键,那么控制器会通知视图滚动。滚动视图对底层的文本不会有任何影响,因此模型永远不会知道这个事件的发生。
模型,视图,控制器对象之间的交互
大多数的Swing组件,模型类将实现一个名字以Model结尾的接口,在这里接口就名为:ButtonModel接口,实现了此接口的类可以定义各种按钮的状态,另外Swing库中有一个名为DefaultButtonModel的类实现了这个接口
可以通过接口的属性来了解按钮维护着什么类型的数据
ButtonModel接口的属性
属性名 | 值 |
---|---|
actionCommand | 与按钮关联的动作命令字符串 |
mnemonic | 按钮的助记快捷键 |
armed | 如果按钮按下且鼠标仍在按钮上则为true |
enabled | 如果按钮时可选择的则为true |
pressed | 如果按钮按下且鼠标案件没有释放则为true |
rollover | 如果鼠标在按钮上则为true |
selected | 如果按钮已经被选择(用于复选框或者单选按钮)则为true |
每个JButton对象都存储这一个按钮的模型的对象,可以如下访问:
var button=new JButton("Blue");
ButtonMode model=button.getModel();
JButton类用BasicButttonUI类作为其视图,用ButtonUIListener类作为其控制器。通常每个Swing组件都有一个相关的后缀为UI的视图对象