第9章 Swing用户界面组件
1. 模型-视图-控制器设计模式
每个组件的三要素:
内容:按钮状态,文本域的文本
外观:颜色大小
行为:对事件的反应
当程序中使用按钮的时候,只需要把他看成是一个按钮,而不需要去考虑它的内部操作和特性
模型-视图-控制器 (Model-view-controller):
模型:存储内容
视图:显示内容
控制器:处理用户输入
模型是完全不可见的。显示存储在模型中的数据是视图的工作
MVC模式的一个优点是一个模型可以有多个视图,其中每个视图可以显示全部内容的不同部分或不同方面
控制器负责处理用户输入事件,然后决定是否把这些事件转化成对模型或视图的改变
模式首先说明使用环境,即产生设计问题的背景,接着解释问题,通常这里会有几个冲突的因素。最终,权衡这些冲突,给出问题的解决方案
设计模式的另一个重要特点就是它们已经成为文化的一部分,模式已经成为探讨设计问题的有效方法
Swing按钮的MVC分析:
对于大多数组件来说,模型类实现了名字结尾为Model的接口
对于一个按钮来说,由模式无法知道他的外观
一般来说,每个Swing组件都有一个相关的后缀为UI的视图对象,但并不是所有的Swing组件都有专门的控制器对象
2. 布局管理器概述
l 布局管理器
容器内的所有组件都由一个布局管理器进行定位
流式布局管理器(flow layout manager)的特点是在一行上水平排列组件,直到没有足够的空间为止,这时开始新的一行。当用户缩放容器时,布局管理器将自动地调整组件的位置使其填充可用空间
还可以选择在每一行上的排列方案。默认是居中显示,另外还可以使用左对齐、右对齐。要想使用,需要在FlowLayout对象的构造器中制定LEFT或者RIGHT参数
l 边界布局
边界布局管理器(border layout manager)
是每个JFrame的内容窗格的默认布局管理器
可以把组件选择放置在内容窗格的中部、北部、南部、东部或西部
先放入边缘组件,剩余的可用空间由中间组件占用。当容器缩放时,边缘组件的厚度不会改变,而中部组件的大小会发生变化。
同流式布局一样,可以通过在BorderLayout的构造器中提供间距参数来指定间距。
l 面板
面板如同界面元素的(较小的)容器,并且在布局管理器的控制之下,他们能够排列在一个更大的面板中
面板对于用户来说是不可见的。面板只是用户界面设计者的一个组织机制
对于JPanel来说,可以利用构造器为其提供不同的布局管理器,JPanel默认的布局管理器是FlowLayout
l 网格布局(GridLayout)
网格布局对象的构造器中,需要指定需要的行数和列数,后两个参数指定了组件间的水平和垂直间距。
添加组件,从第一行的第一列开始,然后是第二行的第二列,以此类推
在实际运用中,小的网格(通常仅仅一行或者一列)在组织窗口的布局区域时比较有用
l
l 将按钮或文本域写在构造器中和写在paintComponent方法中的异同:
当写在构造器中时,按纽或文本域只会在调用构造器的时候被写一次,以后不会再重写,可以改变其形象
当写在paintComponent方法中时,不仅是在调用构造器时被写一次,还会在每次发生repaint方法调用时被写一次,同时有时当paint的事件被调用时,也同样会发生repaint,也会被写一次
所以如果我们在写程序要通过事件监听来改变按钮或文本或者图形的外观时,切记要把它们写在正确的位子,否则会出现不停刷新或根本就不刷新的情况。
固定的,请写在构造器中, 要通过事件监听改变万贯的,请写在paintComponent方法中
3. 文本输入
文本域JTextField 和 文本区JTextArea组件用于获取文本输入。文本域只能接收单行文本输入而文本区可以接收多行文本输入
l 文本域
使用setColumns方法可以改变文本框的大小,但使用之后需要调用包含这个文本框容器的revalidate方法,此方法重新计算容器内所有组件的大小,并且对它们重新进行布局
可以在任何时候调用setText方法来改变文本域中的内容
可以调用getText方法来获得用户键入的文本
想要改变显示文本的字体,就使用setFont方法
l 标签与标签组件
标签是容纳文本的组件。它们没有任何修饰,也不响应用户输入。可以利用标签标识组件
JLable的构造器允许指定初始文本和图标,也可以选择内容的排列方式
使用setText和setIcon方法可以在运行期间设置标签的文本和图标
可以在按钮,标签和菜单项上使用无格式文本和HTML文本。我们不推荐在按钮上使用无格式文本----这样会影响观感,但html文本在标签中时非常有用的
l 文本域或变化跟踪域
文档监听器:DocumentListener
Textfield.getDocument().addDocumentListener()
实现文档监听器接口必须实现3个方法:(文档监听器没有配套的适配器)
insertUpdate removeUpdate changedUpdate
l 密码域
JPasswordField
l 格式化的输入域
此部分主要用来做输入域的验证类,它用一个JFormattedTextField类来简化了做验证的步骤,是系统写好了的包方法,在今后实际要用的时候可以参考此方法,在需要做Swing的表单验证时不要忘记这个地方
l 文本区
用户的输入超过一行,需要使用JTextArea来接收这样的输入
每行都以一个’/n’结尾,如果需要将用户的多个输入分割为多个单独的行,可以使用StringTokenizer类(使用String类的split方法便可以了)
如果文本区的文本超出显示范围,剩下的文本就会被裁减掉,可以使用换行来避免裁减过长的行。但换行只是视觉效果,文档中的文本没有改变,在文本中没有插入’/n’字符
在Swing中插入滚动条:
textArea = new JTestArea(8,40);
JScrollPane scrollpane = new JScrollPane(textArea);
l
4. 选择组件
l 复选框
复选框自动的带有标识标签
使用setSelected 方法选定或取消复选框,使用isSelected方法返回每个复选框的当前状态
l 单选按钮
为单选按钮组构造一个ButtonGroup类型对象,然后把JRadioButton类型的对象添加到按钮组中,按纽组对象负责当新按钮被按下时取消前一个按下的操作
按钮组仅仅控制按钮行为,如果想把这些按钮组织在一个布局,需要把它们添加到容器中
单选按钮的事件通过机制与任何其他按钮一样,当用户点击一个单选按钮时,该按钮产生一个动作事件