程序员人生 网站导航

第12章Swing编程

栏目:php教程时间:2016-06-23 14:48:26

第12章Swing编程

Swing它采取100%java实现 不在依赖本地平台,所有平台都可以保持相同的运行效果,对跨平台支持比较出色  实现了MVC设计模式也称为Model-Delegate(模式-代理)

12.1 Swing概况

独立于本地平台的Swing(速度慢点)组件被称为轻量级组件,而依赖本地平台的AWT组件被称为重量级组件

 

12.2 Swing 基本组件的用法

12.2.1 Swing 组件层次

大部份Swing组件都是JComponent抽象类的直接或间接子类,JComponent类继承了java.atw.Containter类,所以Swing组件类可作为容器使用

Swing中包括了4个组件直接继承了AWT组件,而不是从JComponent派生,JFrame JWindows

JDialog JApplet 他们其实不是轻量级组件,而是重量级组件(需要拜托给GUI组件的平台)

 

Swing组件按功能来分,又可以分为几类

1. 顶层容器 :JFrame JWindows JDialog JApplet

2. 中间容器 :JPanel JScrollPane  JSplitane  JTooLBar

3. 特殊容器 : 在用户界面上具有特殊作用的中间容器 如 JInternalFrame JRootPane

4. 基本组件 : 实现人机交互的组件 JButton JMenu

5. 不可编辑信息的显示组件 :向用户显示不可以编辑的组件信息 JLable

6. 可编辑信息的显示组件 : 向用户显示被编辑的格式化信息的组件 JTable JTextArea

7. 特殊对话框组件 如JColorChooser JFileChooser

 

12.2.2 AWT组件的Swing实现

相对AWT组件 Swing组件具有以下4个功能

1.可以为Swing组件设置提示信息

2.很多Swing组件如 按钮 标签 菜单等 除使用文字外,还可使用图标标示自己

3.支持插拔式的外观风格

4.支持设置边框

 

AWT菜单对象在创建快捷键时,直接传入KeyShortcut对象为其制定快捷键,但Swing菜单项制定快捷键必须通过setAccelerator(KeyStroke ks)方法来设定

SwingUtilities 类的updateComponentTreeUI()方法类跟新制定容器的注意的是跟新的是JFrame对象getContentPanel()方法的返回值,而不是直接跟新JFrame JFrame仍然依赖于本地平台的图象组件

JScrollPaneJTable组件特别重要,通常需要把JTable放在JScrollPane容器中才可以显示出JTable组件的标题栏

 

12.2.3位组件设置边框

可以调用JComponent提供的setBorderBorder b)方法为Swing组件设置边框,其中BorderSwing的接口

TitledBorder Component 比较独特,其中TitleBorder的作用是为其他边框设计标题,当创建1个TitledBorder对象时,就需要传入1个已存在的Border对象,因此每创建1个ComponentBorder对象时都需要传入两个Border对象,1个用作组件的内边框,1个用于组件的外边框

Swing组件添加边框的步骤以下

1.使用BorderFactorXxxBorder创建XxxBorder实例

2.调用Swing组件的setBorderBorder b)方法为该组件设置边框

 

12.2.4 Swing组件的双缓存和键盘驱动

Swing 组件还有两个功能

1. 所有的Swing组件默许启用双缓存绘图技术(避免频沉重绘GUI组件时显示闪烁现象)默许开启

2. 所有的Swing组件都提供了简单的键盘驱动 JComponent类提供了getInputMap() 返回1个InputMap对象,该对象用于将KeyStroke对象和名字关联;getActionMap()返回1个ActionMap对象 用于将制定名字和Action关联,从而可以允许用户通过键盘来操作代替鼠标驱动GUI上的Swing组件 (相当于提供快捷键)

12.2.5 使用JToolBar创建工具条

Swing提供了JToolBar来创建工具条,创建JToolBar对象时可以制定以下两个参数

name :该参数为工具条的名称

orientation : 该参数表示工具条的方向

Action接口是ActionListener接口的子接口,处理提供actionPerformed()方法以外,还包括 name icon 不但可以作为事件监听器使用,还可以转换为按钮或菜单项

 

Action本身不是按钮也不是菜单项,只有当把Action对象添加当某些组件(也能够直接使用Action来创建)也就是说 这些容器需要负责完成以下的事

1.创建1个试用与该容器的组件

2.从Action对象的初始化中取得对的属性来设置组件

3.检查Action对象的初始化 肯定它是不是是激活状态

4.通过Action对象为对应组件注册事件监听器

 

12.2.6 使用JFileChooser

JFileChooser用于创建色彩的对话框 该方法提供了两个静态方法

showDialog(Componment c ,Stting title ,Color col)大部份时候时用来让用户选择色彩

createDialogComponent c ,String tilte ,boolean modal ,JColorChoose jc ,ActionListener listerner ,ActionListenenr cann

 

JFileChooser的功能与AWT中的FileDialog基本相似,也就是生成“打开文件”,“保存文件”对话框

为了调用JFileChooser来打开1个文件对话框,必须下创建该对话框的实例,JFileChooser提供了多个构造器来创建JFileChooser对象

JFileChooser 调用showXxxDialog()方法来显示文件对话框,

 

使用JFileChooser来创建文件对话框运行用户选择文件的步骤以下

1. 采取构造器创建1个JFileChooser对象,该JFileChooser对象无需指定parent组件,所有可以在多个组件之间共有JFileChooser对象

2. 调用JFileChooser的1系列可选方法对JFileChooser履行操作

3. 如果让文件对话框实现文件过滤功能,则需要结合FileFilter类来进行文件过滤

4. 如果需要改变文件对话框的视图外观,则可以结合FileView类来改变对话框中文件的视图外观

5. 调用showXxxDialog 方法可以打开文件对话框

6. JFileChooser提供了两个方法来获得用户选择文件或文件集

 

12.2.7 使用JOptionPane

通过JOptionPane可以非常方便的创建1些简单的对话框,Swing已为这些对话框添加了相应的组件,无需程序员手动添加组件

JOptionPane提供了4个方法来创建对话框

1. showMessageDialog/showInternalMessageDialog 消息对话框,用户只能点肯定(类似js alert

2. showConfirmDialog/showInternalComfirmDialog 肯定对话框 想用户肯定某1个问题 用户可以选择yes  no canel 等 (类似JS comfirm

3. showInputDialog/showInternalInputDialog 输入对话框,提示要求输入某些信息,类似于JSprompt函数 改方法返回用户输入的字符串

4. showOptionDialog/showInternalOptionDialog自定义对话框,可以替换showConfirmDialog所产生的对话框,只是用起来更复杂

JOptionPane产生的所有对话框都是模式的,在用户完成对话框交互前都会1直阻塞当前的线程

12.3 Swing中的特殊容器

Swing提供了1些具有特殊功能的容器,用于创建1些更复杂的用户界面

12.3.1 使用JSplitPane

JSplitPane用于创建1个分割面板,它可以将1个组件(通常是容器)分割成两个部份,并提供1个分割条,用户可以调剂两部份的大小

 

创建分隔板时可以制定1个newContinuousLayout参数,该参数指定分割面板是不是支持连续散布(分割线两边组件将不断的调剂大小)

 

12.3.2 使用JTabbedPane

JTabbedPane可以很方便的在窗口上放置多个标签页,每一个标签页相当于取得1个与外部容用具有大小相同的组件摆放区,通过这类方式,可以在1个容器里放置更多的组件

如果需要使用JTabbedPane在窗口上创建标签页步骤以下

1.创建1个JTabbedPane对象(构造器包括以下两个参数 tabPlacement 指定标签页放置的位置  tabLayoutPolicy 指定标签页的布局策略 有两种(JTabbedPane.WRAP_TAB_LAYOUT)标题换行  (SCROLL_TAB_LAYOUT)使用转动条显示)

2.调用JTabbedPane对象的addTab() insertTab()()等方法来增删改查(不要使用add()方法来增加组件 后插入的组件会覆盖之前增加的组件)

3.如果需要某1个标签显示出来则可以调用JTabbedPanesetSelectedIndex()方法来实现

4.程序还可以通过JTabbedPane提供的1系列方法来操作JTabbedPane的相干属性

5.如果程序需要监听用户点击某1个标签,则可使用监听器来监听JTabbedPane对象

 

12.3.3使用JLayeredPane JDesktopPane JInternalFrame

JLayeredPane是1个代表有层次深度的容器,它允许组件在需要时相互叠加,当向JLayeredPane容器中添加组件时,需要为组件指定1个深度索引,其中层次索引较高的层的组件位于其他层组件之上

JLayeredPane中添加组件必须要显示的设置该组件的大小和位置 ,否则该组件显示不出来

 

JDesktopPane 需要和JInternalFrame组合使用,其中JDesktopPane代表了1个虚拟桌面,而JInternalFrame则用于创建内部窗口 创建步骤以下

1. 创建1个JDesktopPane对象,

2. 使用JInternalFrame创建1个内部窗口,创建内部窗口时除可以穿字符串作为窗口的名字还可以传4Boolean值 用于表示是不是允许改变窗口大小 关闭窗口 最大化窗口 最小化窗口

3. 1旦取得内部窗口以后,该窗口的用法和普通窗口的用法基本1样,1样可以制定该窗口的布局管理器,可以添加组件。。

4. 将该内部窗口以适合的大小适合的位置显示出来(该窗口默许大小是0*0 位于 0,0处于隐藏状态)

5. 将内部窗口添加到 JDesktopPane 容器,在将 JDesktopPane 容器加到其他容器

 

 JDesktopPane 不能独立存在,必须将 JDesktopPane 添加到其他顶级容器中才能正常使用

 

12.4 Swing简化拖放功能

java 1.4 开始Swing部份组件就提供了默许的拖放支持,除此以外,Swing还提供该了1个非常特殊的类 TransferHandler,它可以直接将某1个组件的指定属性设置为拖放目标(条件该组件具有该属性的setter方法)

 

12.5 java 7 新增的Swing功能

java 7 提供了重大的更新包括对Swing的更新,对Swing的更新除前面介绍的Nimbus外观改进了JColorChooser组件外,还有两个重要的跟新 JLayer和创建不规则窗口

 

12.5.1 使用JLayer装潢组件

JLayer的功能是在指定的组件上额外的添加1个装潢层,开发者可以在这个装潢层上任意绘制,可以指定组件添加任意装潢

JLayer1般总是要和LayerUI1起使用 ,而LAyerUI用于被扩大,扩大时重写它的paint(Graphics g ,JComponent c)方法

12.5.2 创建透明、不规则状态窗口

java 7 Frame提供了两个方法

serShapeShape shape) 设置窗口的形状

serOpacityfloat opacity)设置窗口的透明度

 

12.6 使用JProgressBar ProgressMonitor       BoundedRangeModel 创建进度条

12.6.1 创建进度条

使用JProgressBar可以非常方便的创建进度条,步骤以下

1.创建1个JProgressBar对象,创建对象时可以指定3个参数,(用于设置进度条的排列方式 进度条的最大和最小值)

2.调用该对象的经常使用方法设置进度条的普通方法

3.当程序中工作进度完成改变时,调用用于JProgressBar对象的setValue()方法

 

12.6.2 创建进度对话框

ProgressMonitor的用法和JProgressBar的用法基本相似,只是ProgressMonitor可以直接创建1个进步对话框 ProgressMonitor提供以下构造器

ProgressMonitorComponent parentcom ,Object message , String note ,int mix ,int max

使用ProgressMonitor创建的对话框包括的进度条是1个非常固定的 程序乃至不能设置该进度条是不是包括边框,(总是包括边框)不能设置进度不肯定,不能改变进度条的方向(总是水平方向)

 

12.7 使用JSiderBoundedRangeModel创建滑动条

JSider的用法和JProgressBar的用法非常相似,这1点可以从它们同享同1个Model类看出来 主要区分以下

1.JSlide不是采取填充色彩的方式来表示该组件确当前值,而是采取滑块的位置来表示该组件确当前值

2.JSider允许用户手动改变滑动条确当前值

3.JSider 允许为滑动条指定刻度值,这系列的刻度值可以是连续的数字,也能够是自定义的刻度值,乃至多是图标

 

使用JSider的构造器创建滑动条的步骤以下

1.使用JSider的构造器创建1个JSider对象,

2.调用JSider的以下方法来设置滑动条的外观样式

3.如果程序需要在用户拖动滑块时做出相应的处理,则应为JSider对象添加时间监听器

4.将JSider对象添加到其他容器中显示出来

 

12.8 使用JSpinner SpinnerModel 创建微调控制器

JSpinner组件是1个带有两个小箭头的文本框,这个文本框只能接收满足要求的数据,用户既可以通太小箭头调剂该微调控制器的值,也能够直接在文本框内输入内容来改变文本框微调控制器的值

 

通常JSpinner组件常常需要和SprinnerModel结合使用,其中JSpinner控制组件的外观,而SprinnerModel控制该组件的内部状态数据

JSpinner组件的值可以是数值 日期 和List中的值

JSpinner组件还可以是任意系列 只要这个系类可以通过previous() next() 取得值便可,在这类情况下用户必须自行提供SpinnerModel实现类

 

12.9 使用JList JComboBox创建列表框

JList JComboBox都是极为相似的,他们都有1个列表框,只有JComboBox的列表框需要以下拉方式显示出来

JList JComboBox都可以通过调用setRenderer()方式来改变列表框的表现情势

12.9.1简单列表框

如果仅需要创建1个简单的列表框,则直接使用他们的构造器便可,他们的构造器都可以接收1个对象数组或元素类型的任意Vector作为参数,这个对象数组或元素类型任意的Vector里的所有元素将被转换为列表框的列表项

步骤

1.使用JList JComboBox的构造器来创建1个列表框对象

2.调用JList JComboBox 的各种方法来设置列表框的外观行动

3.如果有需要监听列表框选项的变化,则可以通过监听器来实现

 

12.9.2 不强迫存储列表项的JListModel JComboBoxModel

Swing的绝大部份组件都实现了MVC的设计模式,其中JListModel JComboBoxModel只负责组件的外观显示,而组件的状态数据保护则有对应的Model负责,JList对应的ModelListModel接口

12.9.3 强迫存储列表项的DefaultListModelDefaultComboBoxModel

当使用JListModel JComboBoxModel经常常需要动态的增加插入删除列表项

但是JListModel 并没有提供这些类似的方法,实际上对JList还是很难删除列表项。

所以应当在创建JList时显示使用DefaultListModel作为构造参数

由于DefaultListModel作为JListModel,它负责保护JList组件的所有列表数据

 

为何JComboBox提供了增删改 而 JList没有

由于 直接使用数组 vector 创建JListJComboBox对应实现类不1样,创建JComboBoxModelDefaultComboBoxModel,这是1个可变集合类,所有使用数组集合可以直接增删改

但使用数据Vector创建的JList对应的Model分别是JList$1,JList$2 (内部类)

 

DefaultListModelDefaultComboBoxModel 是两个强迫保存所有列表项的Model类,他们使用Vector来保存所有列表项

 

12.9.4 使用ListCellRender 改变列表项外观

JList JComboBox 都可以支持图标列表,如果创建JList JComboBox 传入图标数组,则创建的JList JComboBox 列表项就是图标

ListCellRender只是1个接口,它并未强迫指定列表项绘制属于那种组件,因此可扩大任何组件来实现ListCellRender接口

 

12.10 使用 JTree TreeModal创建树

树是图形用户界面中使用非常广泛的GUI组件,

1个树只能有1个根节点如果1个树有多个节点,那它就不是树1棵树了,而是多棵树的集合,也被称为森林

12.10.1 创建树

Swing使用JTree对象来代表1棵树,(实际上也能够是森林)JTree树种节点可使用TreePath来标识,该对象封装了当前节点及所有父节点

节点及所有的父节点才能标识1个节点

1个节点有2种状态

1.展开状态

2.折叠状态

只有当某1个节点的所有父节点(直接的和间接的)都全部展开才能是可见的

如果希望创建1棵树,则直接使用JTree构造器创建JTree对象便可

为了利用根节点来创建JTree,程序需要创建1个TreeNode对象(接口),该接口有1个子接口MutableTreeNode,程序可以通过该接口的实现类DefaultMutableTreeNode来创建树节点并通过add()方法来添加节点之间的父子关系

 

DefaultMutableTreeNode提供还提供了深度优先遍历和广度优先遍历两个方法

12.10.2 拖到,编辑树节点

JTree生成的树默许是不可编辑的,不可以添加、删除节点,也不可以变换节点,如果想让某1个树变成可编辑状态,则可以调用JTreesetEditableBoolean b)改成true便可变成可编辑的树了

JTree处理节点有两种方式

1.1种是根据TreePath

2.另外一种是根据节点行号

所有JTree显示的节点都有1个唯1的行号,只有那些被显示出来的节点才有行号,(如果该节点之前被展开 折叠或修改 那末该节点行号可能产生变化)所以使用TreePath比较稳定

 

12.10.3 监听节点事件

JTree专门提供了1个TreeSelectionModel对象来保存该JTree选中状态信息,也就是说JTree组件背后隐藏了两个model对象,其中TreeModel用于保存该JTree的所有节点数据,而TreeSelectionModel用于保存该JTree中被选中的信息

程序可以通过getSelectPath getSelectPaths()方法来获得被选中的TreePath 实际上这两个方法还是依赖于TreeSelectionModel

 

12.10.4 使用DefaultTreeCellRenderer改变节点外观

JTree也可也改变树节点的外观,包括改变节点的图标,字体等,乃至可以自由绘制节点的外观,为了改变外观,可以通过树指定自己的CellRenderer来实现,JTree默许使用DefaultTreeCellRenderer来绘制每一个节点 该类是JLabel的子类

改变树节点的外观样式 可以有以下3种方式

1.使用DefaultTreeCellRenderer直接改变节点的外观,这类方式可改变整棵树所有节点的字体色彩和图标

2.为JTree指定DefaultTreeCellRenderer的扩大对象作为JTree的节点绘制器,该节点负责为不同的节点使用不同的字体色彩和图标

3.为JTree指定1个实现TreeCellRenderer接口的节点绘制器 该节点可为不同的节点自由绘制任意内容

 

12.10.5 扩大DefaultTreeCellRenderer改变节点外观

DefaultTreeCellRenderer类实现了TreeCellRenferer接口,给接口里只有1个用于绘制节点内容的方法 getTreeCellRendererComponent(),该方法负责绘制JTree节点

DefaultTreeCellRenderer类继承了JLabel,实现getTreeCellRendererComponent()方法时返回this,返回的是JLabel对象

 

12.10.6 实现TreeCellRenderer改变外观

程序实现TreeCellRenderer时1样要实现getTreeCellRendererComponent()方法,该方法返回任意类型的组件,该组件将作为JTree节点

程序一样是通过扩大JPanel来实现TreeCellRenferer

 

12.11 使用JTableTableModel创建表格

12.11.1 创建表格

使用JTable来创建表格是非常容易的事情,JTable可以把1个2维数据包装成1个表格这个2维数据包可以是2维数组也能够是集合元素为VectorVector对象

在默许情况下 JTable的表格数据,表格列表全部都是字符串内容,可以通过特定的TableModel或自己制定自己的单元格绘制器来实现

通常应当讲JTable对象放在JScrollPane容器由JSrollPaneJTable提供viewPort(不但可以为JTable增加转动条,而且可让JTable的标题显示出来,如果不把JTable放在JScorllPaneJTable默许不会显示列标题)

12.11.2 TableModel 和监视器

JList. JTree类似的是,JTable采取TableModel来保存表格中的所有状态数据,与ListModel类似的是,TableModel 也不强迫保存该表格显示的数据,

也能够通过TableModel对象来创建表格。

 

12.11.3 TableColumnModel 和监听器

JTable使用TableColumnModel 来保存该表格所有数据列的状态数据,如果程序需要访问JTable的所有列状态信息,则可以通过获得该JTableTableColumnModel来实现

12.11.4 实现排序

使用JTable实现的表格并没有实现排序功能,但是可使用AbstactTableModel类来实现该功能,只要TableModel实现了getValueAt(),getColumnCount(),getRowCount(), JTable 就能够根据该TableModel生成表格,因此可以创建1个SortableTableModel实现类,将TableModel封装起来,并实现排序功能

------分隔线----------------------------
------分隔线----------------------------

最新技术推荐