第12章Swing编程
第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仍然依赖于本地平台的图象组件 JScrollPane对JTable组件特别重要,通常需要把JTable放在JScrollPane容器中才可以显示出JTable组件的标题栏
12.2.3位组件设置边框可以调用JComponent提供的setBorder(Border b)方法为Swing组件设置边框,其中Border是Swing的接口 TitledBorder 和Component 比较独特,其中TitleBorder的作用是为其他边框设计标题,当创建1个TitledBorder对象时,就需要传入1个已存在的Border对象,因此每创建1个ComponentBorder对象时都需要传入两个Border对象,1个用作组件的内边框,1个用于组件的外边框 Swing组件添加边框的步骤以下 1.使用BorderFactor或XxxBorder创建XxxBorder实例 2.调用Swing组件的setBorder(Border 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 使用JFileChooserJFileChooser用于创建色彩的对话框 该方法提供了两个静态方法 showDialog(Componment c,Stting title,Color col)大部份时候时用来让用户选择色彩 createDialog(Component 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 输入对话框,提示要求输入某些信息,类似于JS的prompt函数 改方法返回用户输入的字符串 4. showOptionDialog/showInternalOptionDialog自定义对话框,可以替换showConfirmDialog所产生的对话框,只是用起来更复杂 JOptionPane产生的所有对话框都是模式的,在用户完成对话框交互前都会1直阻塞当前的线程 12.3 Swing中的特殊容器Swing提供了1些具有特殊功能的容器,用于创建1些更复杂的用户界面 12.3.1 使用JSplitPaneJSplitPane用于创建1个分割面板,它可以将1个组件(通常是容器)分割成两个部份,并提供1个分割条,用户可以调剂两部份的大小
创建分隔板时可以制定1个newContinuousLayout参数,该参数指定分割面板是不是支持连续散布(分割线两边组件将不断的调剂大小)
12.3.2 使用JTabbedPaneJTabbedPane可以很方便的在窗口上放置多个标签页,每一个标签页相当于取得1个与外部容用具有大小相同的组件摆放区,通过这类方式,可以在1个容器里放置更多的组件 如果需要使用JTabbedPane在窗口上创建标签页步骤以下 1.创建1个JTabbedPane对象(构造器包括以下两个参数 tabPlacement 指定标签页放置的位置 tabLayoutPolicy 指定标签页的布局策略 有两种(JTabbedPane.WRAP_TAB_LAYOUT)标题换行 (SCROLL_TAB_LAYOUT)使用转动条显示) 2.调用JTabbedPane对象的addTab() insertTab()()等方法来增删改查(不要使用add()方法来增加组件 后插入的组件会覆盖之前增加的组件) 3.如果需要某1个标签显示出来则可以调用JTabbedPane的setSelectedIndex()方法来实现 4.程序还可以通过JTabbedPane提供的1系列方法来操作JTabbedPane的相干属性 5.如果程序需要监听用户点击某1个标签,则可使用监听器来监听JTabbedPane对象
12.3.3使用JLayeredPane JDesktopPane 和JInternalFrameJLayeredPane是1个代表有层次深度的容器,它允许组件在需要时相互叠加,当向JLayeredPane容器中添加组件时,需要为组件指定1个深度索引,其中层次索引较高的层的组件位于其他层组件之上 向JLayeredPane中添加组件必须要显示的设置该组件的大小和位置 ,否则该组件显示不出来
JDesktopPane 需要和JInternalFrame组合使用,其中JDesktopPane代表了1个虚拟桌面,而JInternalFrame则用于创建内部窗口 创建步骤以下 1. 创建1个JDesktopPane对象, 2. 使用JInternalFrame创建1个内部窗口,创建内部窗口时除可以穿字符串作为窗口的名字还可以传4个Boolean值 用于表示是不是允许改变窗口大小 关闭窗口 最大化窗口 最小化窗口 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提供了两个方法 serShape(Shape shape) 设置窗口的形状 serOpacity(float 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提供以下构造器 ProgressMonitor(Component parentcom,Object message,String note,int mix,int max) 使用ProgressMonitor创建的对话框包括的进度条是1个非常固定的 程序乃至不能设置该进度条是不是包括边框,(总是包括边框)不能设置进度不肯定,不能改变进度条的方向(总是水平方向)
12.7 使用JSider和BoundedRangeModel创建滑动条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 和 JComboBoxModelSwing的绝大部份组件都实现了MVC的设计模式,其中JListModel 和 JComboBoxModel只负责组件的外观显示,而组件的状态数据保护则有对应的Model负责,JList对应的Model是ListModel接口 12.9.3 强迫存储列表项的DefaultListModel和DefaultComboBoxModel当使用JListModel 和 JComboBoxModel经常常需要动态的增加插入删除列表项 但是JListModel 并没有提供这些类似的方法,实际上对JList还是很难删除列表项。 所以应当在创建JList时显示使用DefaultListModel作为构造参数 由于DefaultListModel作为JList的Model,它负责保护JList组件的所有列表数据
为何JComboBox提供了增删改 而 JList没有 由于 直接使用数组 vector 创建JList和JComboBox对应实现类不1样,创建JComboBox的Model是DefaultComboBoxModel,这是1个可变集合类,所有使用数组集合可以直接增删改 但使用数据Vector创建的JList对应的Model分别是JList$1,JList$2 (内部类)
DefaultListModel和DefaultComboBoxModel 是两个强迫保存所有列表项的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个树变成可编辑状态,则可以调用JTree的setEditable(Boolean 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 使用JTable和TableModel创建表格12.11.1 创建表格使用JTable来创建表格是非常容易的事情,JTable可以把1个2维数据包装成1个表格这个2维数据包可以是2维数组也能够是集合元素为Vector的Vector对象 在默许情况下 JTable的表格数据,表格列表全部都是字符串内容,可以通过特定的TableModel或自己制定自己的单元格绘制器来实现 通常应当讲JTable对象放在JScrollPane容器由JSrollPane为JTable提供viewPort(不但可以为JTable增加转动条,而且可让JTable的标题显示出来,如果不把JTable放在JScorllPane中 JTable默许不会显示列标题) 12.11.2 TableModel 和监视器与JList. JTree类似的是,JTable采取TableModel来保存表格中的所有状态数据,与ListModel类似的是,TableModel 也不强迫保存该表格显示的数据, 也能够通过TableModel对象来创建表格。
12.11.3 TableColumnModel 和监听器JTable使用TableColumnModel 来保存该表格所有数据列的状态数据,如果程序需要访问JTable的所有列状态信息,则可以通过获得该JTable的TableColumnModel来实现 12.11.4 实现排序使用JTable实现的表格并没有实现排序功能,但是可使用AbstactTableModel类来实现该功能,只要TableModel实现了getValueAt(),getColumnCount(),getRowCount(),JTable 就能够根据该TableModel生成表格,因此可以创建1个SortableTableModel实现类,将TableModel封装起来,并实现排序功能 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |