![]() ![]() |
|
JAVA教程第七讲Swing用户界面设计7.2 | |
作者:佚名 文章来源:不详 点击数 更新时间:2008/4/18 14:42:37 文章录入:杜斌 责任编辑:杜斌 | |
|
|
7.2 Swing组件和容器 在Swing中不但用轻量级的组件替代了AWT中的重量级的组件,而且Swing的替代组件中都包含有一些其他的特性。例如,Swing的按钮和标签可显示图标和文本,而AWT的按钮和标签只能显示文本。Swing中的大多数组件都是AWT组件名前面加了一个"J"。 7.2.1 组件的分类 Jcomponent是一个抽象类,用于定义所有子类组件的一般方法,其类层次结构如下所示: JComponent类的特殊功能又分为: 2) 双缓冲区:使用双缓冲技术能改进频繁变化的组件的显示效果。与AWT组件不同,JComponent组件默认双缓冲区,不必自己重写代码。如果想关闭双缓冲区,可以在组件上施加setDoubleBuffered(false)方法。 7.2.2 使用Swing的基本规则 与AWT组件不同,Swing组件不能直接添加到顶层容器中,它必须添加到一个与Swing顶层容器相关联的内容面板(content pane)上。内容面板是顶层容器包含的一个普通容器,它是一个轻量级组件。基本规则如下: 7.2.3 各种容器面板和组件 看图 根面板由一个玻璃面板(glassPane)、一个内容面板(contentPane)和一个可选择的菜单条(JMenuBar)组成,而内容面板和可选择的菜单条放在同一分层。玻璃面板是完全透明的,缺省值为不可见,为接收鼠标事件和在所有组件上绘图提供方便。 7.2.3.2 分层面板(JLayeredPane) Swing提供两种分层面板:JlayeredPane和JDesktopPane。 JDesktopPane是JLayeredPane的子类,专门为容纳内部框架(JInternalFrame)而设置。 7.2.3.3 面板(JPanel) 面板(JPanel)是一个轻量容器组件,用法与Panel相同,用于容纳界面元素,以便在布局管理器的设置下可容纳更多的组件,实现容器的嵌套。Jpanel, JscrollPane, JsplitPane, JinteralFrame都属于常用的中间容器,是轻量组件。Jpanel的缺省布局管理器是FlowLayout。 7.2.3.4 滚动窗口(JScrollPane) 看图1 看图2 JscrollPane是带滚动条的面板,主要是通过移动JViewport(视口)来实现的。JViewport是一种特殊的对象,用于查看基层组件,滚动条实际就是沿着组件移动视口,同时描绘出它在下面"看到"的内容。
7.2.3.5 分隔板(JSplitPane) java.lang.Object 7.2.3.6 选项板(JTabbedPane)] 看图 JTabbedPane提供一组可供用户选择的带有标签或图标的开关键。常用方法: 7.2.3.7 工具栏(JToolBar) 7.2.3.8 内部框架(JInternalFrame) 看图 内部框架JInternalFrame就如同一个窗口在另一个窗口内部,其特点如下: 7.2.3.9 按钮(JButton) 按钮是一个常用组件,按钮可以带标签或图象。 例7.2 看图 7.2.3.10 复选框(JCheckBox) 复选框提供简单的"on/off"开关,旁边显示文本标签。如图 7.2.3.11 单选框(JRadioButton) 单选框JRadioButton与AWT中的复选框组功能类似。如图 7.2.3.12 选择框(JComboBox) JComboBox每次只能选择其中的一项,但是可编辑每项的内容,而且每项的内容可以是任意类,而不再局限于String。如图 7.2.3.13 文件选择器(JFileChooser) JFileChooser内建有"打开","存储"两种对话框,还可以自己定义其他种类的对话框。如图 7.2.3.14 标签(JLabel) 提供可带图形的标签 如图 7.2.3.15 列表(List) 适用于数量较多的选项以列表形式显示,里面的项目可以由任意类型对象构成。支持单选和多选。如图 7.2.3.16 菜单(JMenu) JMenu与AWT的菜单Menu的不同之处是它可以通过setJMenuBar(menubar)将菜单放置到容器中的任意地方。如图 7.2.3.17 进程条(JProgressBar) 进程条是提供一个直观的图形化的进度描述,从"空"到"满"的过程。如图 7.2.3.18 滑动条(JSlider) 滑动条使得用户能够通过一个滑块的来回移动来输入数据。如图
7.2.3.19 表格(JTable) 表格是Swing新增加的组件,主要功能是把数据以二维表格的形式显示出来。使用表格,依据M-V-C的思想,最好先生成一个MyTableModel类型的对象来表示数据,这个类是从AbstractTableModel类中继承来的,其中有几个方法是一定要重写,例如getColumnCount,getRowCount,getColumnName,getValueAt。因为Jtable会从这个对象中自动获取表格显示所必需的数据,AbstractTableModel类的对象负责表格大小的确定(行、列)、内容的填写、赋值、表格单元更新的检测等等一切跟表格内容有关的属性及其操作。JTable类生成的对象以该TableModel为参数,并负责将TableModel对象中的数据以表格的形式显示出来。 例7.3 RecorderOfWorkers public class TableDemo extends JFrame { //将带滚动条的面板添加入窗口中 addWindowListener(new WindowAdapter() {//注册窗口监听器 //下述方法是重写AbstractTableModel中的方法,其主要用途是被JTable对象调用,以便在表格中正确的显示出来。程序员必须根据采用的数据类型加以恰当实现。 //获得行的数目 //判断每个单元格的类型 //将表格声明为可编辑的 //改变某个数据的值 if (data[0][col] instanceof Integer if (DEBUG) {
private void printDebugData() { for (int i=0; i < numRows; i++) { public static void main(String[] args) { 7.2.3.20 树(JTree)
import java.awt.*; jf.getContentPane().add(new Trees(), BorderLayout.CENTER); 运行结果是多种多样的,与用户点击按钮的次序有关,其中一种结果如下
7.2.4 布局管理器 和AWT相同,为了容器中的组件能实现平台无关的自动合理排列,Swing也采用了布局管理器来管理组件的排放、位置、大小等布置任务,在此基础上将显示风格做了改进。 JScrollPane listScroller=new JScrollPane(list);
//从上到下设置标签和滚动板. JPanel listPane=new JPanel(); listPane.setLayout(new BoxLayout(listPanae,BoxLayout,Y_AXIS)); JLabel label=new JLabel(labelText); listPane.add(label); listPane.add(Box.createRigidArea(new Demension(0,5))); listPane.add(listScroller); listPane.setBorder(BorderFactory.creatEmptyBorder(10,10,10,10); //从左到右设置按钮 JPanel buttonPane=new JPanel(); buttonPane.setLayout(new BoxLayout(buttonPane,Boxlayout.X_AXIS)); buttonPane.setBoder(BorderFactory.createEmptyBorder(0,10,10,10)); buttonPane.add(Box.createHorizontalGlue()); buttonPane.add(cancelButton); buttonPane.add(Box.createRigiArea(new Dimension(10,0))); buttonPane.add(setButton); Container contentPane=getContentPane(); contentPane.add(listPane,BorderLayout.CENTER); contentPane.add(buttonPane,BorderLayout.SOUTH); 【本讲小结】 对于AWT而言,Java 1.1到Java 1.2最大的改变就是Java中所有的库。当Java 1.1版纳入新的事件模型和Java Beans时,平台被设置--现在它可以被拖放到可视化的应用程序构建工具中,创建GUI组件。另外,事件模型的设计和Bean无疑对轻松的编程和可维护的代码都非常有益。对于Swing组件而言,交叉平台GUI编程可以变成一种有意义的尝试。 |
|
![]() ![]() |