Swing它采取100%java实现 不在依赖本地平台,所有平台都可以保持相同的运行效果,对跨平台支持比较出色 实现了MVC设计模式也称为Model-Delegate(模式-代理)
独立于本地平台的Swing(速度慢点)组件被称为轻量级组件,而依赖本地平台的AWT组件被称为重量级组件
大部份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
相对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组件的标题栏
可以调用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)方法为该组件设置边框
Swing 组件还有两个功能
1. 所有的Swing组件默许启用双缓存绘图技术(避免频沉重绘GUI组件时显示闪烁现象)默许开启
2. 所有的Swing组件都提供了简单的键盘驱动 JComponent类提供了getInputMap() 返回1个InputMap对象,该对象用于将KeyStroke对象和名字关联;getActionMap()返回1个ActionMap对象 用于将制定名字和Action关联,从而可以允许用户通过键盘来操作代替鼠标驱动GUI上的Swing组件 (相当于提供快捷键)
Swing提供了JToolBar来创建工具条,创建JToolBar对象时可以制定以下两个参数
name :该参数为工具条的名称
orientation : 该参数表示工具条的方向
Action接口是ActionListener接口的子接口,处理提供actionPerformed()方法以外,还包括 name 和 icon 不但可以作为事件监听器使用,还可以转换为按钮或菜单项
Action本身不是按钮也不是菜单项,只有当把Action对象添加当某些组件(也能够直接使用Action来创建)也就是说 这些容器需要负责完成以下的事
1.创建1个试用与该容器的组件
2.从Action对象的初始化中取得对的属性来设置组件
3.检查Action对象的初始化 肯定它是不是是激活状态
4.通过Action对象为对应组件注册事件监听器
JFileChooser用于创建色彩的对话框 该方法提供了两个静态方法
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提供了两个方法来获得用户选择文件或文件集
通过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直阻塞当前的线程
Swing提供了1些具有特殊功能的容器,用于创建1些更复杂的用户界面
JSplitPane用于创建1个分割面板,它可以将1个组件(通常是容器)分割成两个部份,并提供1个分割条,用户可以调剂两部份的大小
创建分隔板时可以制定1个newContinuousLayout参数,该参数指定分割面板是不是支持连续散布(分割线两边组件将不断的调剂大小)
JTabbedPane可以很方便的在窗口上放置多个标签页,每一个标签页相当于取得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对象
JLayeredPane是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 添加到其他顶级容器中才能正常使用
java 1.4 开始Swing部份组件就提供了默许的拖放支持,除此以外,Swing还提供该了1个非常特殊的类 TransferHandler,它可以直接将某1个组件的指定属性设置为拖放目标(条件该组件具有该属性的setter方法)
java 7 提供了重大的更新包括对Swing的更新,对Swing的更新除前面介绍的Nimbus外观改进了JColorChooser组件外,还有两个重要的跟新 JLayer和创建不规则窗口
JLayer的功能是在指定的组件上额外的添加1个装潢层,开发者可以在这个装潢层上任意绘制,可以指定组件添加任意装潢
JLayer1般总是要和LayerUI1起使用 ,而LAyerUI用于被扩大,扩大时重写它的paint(Graphics g ,JComponent c)方法
java 7 位Frame提供了两个方法
serShape(Shape shape) 设置窗口的形状
serOpacity(float opacity)设置窗口的透明度
使用JProgressBar可以非常方便的创建进度条,步骤以下
1.创建1个JProgressBar对象,创建对象时可以指定3个参数,(用于设置进度条的排列方式 进度条的最大和最小值)
2.调用该对象的经常使用方法设置进度条的普通方法
3.当程序中工作进度完成改变时,调用用于JProgressBar对象的setValue()方法
ProgressMonitor的用法和JProgressBar的用法基本相似,只是ProgressMonitor可以直接创建1个进步对话框 ProgressMonitor提供以下构造器
ProgressMonitor(Component parentcom ,Object message , String note ,int mix ,int max)
使用ProgressMonitor创建的对话框包括的进度条是1个非常固定的 程序乃至不能设置该进度条是不是包括边框,(总是包括边框)不能设置进度不肯定,不能改变进度条的方向(总是水平方向)
JSider的用法和JProgressBar的用法非常相似,这1点可以从它们同享同1个Model类看出来 主要区分以下
1.JSlide不是采取填充色彩的方式来表示该组件确当前值,而是采取滑块的位置来表示该组件确当前值
2.JSider允许用户手动改变滑动条确当前值
3.JSider 允许为滑动条指定刻度值,这系列的刻度值可以是连续的数字,也能够是自定义的刻度值,乃至多是图标
使用JSider的构造器创建滑动条的步骤以下
1.使用JSider的构造器创建1个JSider对象,
2.调用JSider的以下方法来设置滑动条的外观样式
3.如果程序需要在用户拖动滑块时做出相应的处理,则应为JSider对象添加时间监听器
4.将JSider对象添加到其他容器中显示出来
JSpinner组件是1个带有两个小箭头的文本框,这个文本框只能接收满足要求的数据,用户既可以通太小箭头调剂该微调控制器的值,也能够直接在文本框内输入内容来改变文本框微调控制器的值
通常JSpinner组件常常需要和SprinnerModel结合使用,其中JSpinner控制组件的外观,而SprinnerModel控制该组件的内部状态数据
JSpinner组件的值可以是数值 日期 和List中的值
JSpinner组件还可以是任意系列 只要这个系类可以通过previous() next() 取得值便可,在这类情况下用户必须自行提供SpinnerModel实现类
JList 和JComboBox都是极为相似的,他们都有1个列表框,只有JComboBox的列表框需要以下拉方式显示出来
JList JComboBox都可以通过调用setRenderer()方式来改变列表框的表现情势
如果仅需要创建1个简单的列表框,则直接使用他们的构造器便可,他们的构造器都可以接收1个对象数组或元素类型的任意Vector作为参数,这个对象数组或元素类型任意的Vector里的所有元素将被转换为列表框的列表项
步骤
1.使用JList JComboBox的构造器来创建1个列表框对象
2.调用JList JComboBox 的各种方法来设置列表框的外观行动
3.如果有需要监听列表框选项的变化,则可以通过监听器来实现
Swing的绝大部份组件都实现了MVC的设计模式,其中JListModel 和 JComboBoxModel只负责组件的外观显示,而组件的状态数据保护则有对应的Model负责,JList对应的Model是ListModel接口
当使用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来保存所有列表项
JList 和JComboBox 都可以支持图标列表,如果创建JList 和JComboBox 传入图标数组,则创建的JList 和JComboBox 列表项就是图标
ListCellRender只是1个接口,它并未强迫指定列表项绘制属于那种组件,因此可扩大任何组件来实现ListCellRender接口
树是图形用户界面中使用非常广泛的GUI组件,
1个树只能有1个根节点如果1个树有多个节点,那它就不是树1棵树了,而是多棵树的集合,也被称为森林
Swing使用JTree对象来代表1棵树,(实际上也能够是森林)JTree树种节点可使用TreePath来标识,该对象封装了当前节点及所有父节点
节点及所有的父节点才能标识1个节点
1个节点有2种状态
1.展开状态
2.折叠状态
只有当某1个节点的所有父节点(直接的和间接的)都全部展开才能是可见的
如果希望创建1棵树,则直接使用JTree构造器创建JTree对象便可
为了利用根节点来创建JTree,程序需要创建1个TreeNode对象(接口),该接口有1个子接口MutableTreeNode,程序可以通过该接口的实现类DefaultMutableTreeNode来创建树节点并通过add()方法来添加节点之间的父子关系
DefaultMutableTreeNode提供还提供了深度优先遍历和广度优先遍历两个方法
JTree生成的树默许是不可编辑的,不可以添加、删除节点,也不可以变换节点,如果想让某1个树变成可编辑状态,则可以调用JTree的setEditable(Boolean b)改成true便可变成可编辑的树了
JTree处理节点有两种方式
1.1种是根据TreePath
2.另外一种是根据节点行号
所有JTree显示的节点都有1个唯1的行号,只有那些被显示出来的节点才有行号,(如果该节点之前被展开 折叠或修改 那末该节点行号可能产生变化)所以使用TreePath比较稳定
JTree专门提供了1个TreeSelectionModel对象来保存该JTree选中状态信息,也就是说JTree组件背后隐藏了两个model对象,其中TreeModel用于保存该JTree的所有节点数据,而TreeSelectionModel用于保存该JTree中被选中的信息
程序可以通过getSelectPath 和getSelectPaths()方法来获得被选中的TreePath 实际上这两个方法还是依赖于TreeSelectionModel
JTree也可也改变树节点的外观,包括改变节点的图标,字体等,乃至可以自由绘制节点的外观,为了改变外观,可以通过树指定自己的CellRenderer来实现,JTree默许使用DefaultTreeCellRenderer来绘制每一个节点 该类是JLabel的子类
改变树节点的外观样式 可以有以下3种方式
1.使用DefaultTreeCellRenderer直接改变节点的外观,这类方式可改变整棵树所有节点的字体色彩和图标
2.为JTree指定DefaultTreeCellRenderer的扩大对象作为JTree的节点绘制器,该节点负责为不同的节点使用不同的字体色彩和图标
3.为JTree指定1个实现TreeCellRenderer接口的节点绘制器 该节点可为不同的节点自由绘制任意内容
DefaultTreeCellRenderer类实现了TreeCellRenferer接口,给接口里只有1个用于绘制节点内容的方法 getTreeCellRendererComponent(),该方法负责绘制JTree节点
DefaultTreeCellRenderer类继承了JLabel,实现getTreeCellRendererComponent()方法时返回this,返回的是JLabel对象
程序实现TreeCellRenderer时1样要实现getTreeCellRendererComponent()方法,该方法返回任意类型的组件,该组件将作为JTree节点
程序一样是通过扩大JPanel来实现TreeCellRenferer
使用JTable来创建表格是非常容易的事情,JTable可以把1个2维数据包装成1个表格这个2维数据包可以是2维数组也能够是集合元素为Vector的Vector对象
在默许情况下 JTable的表格数据,表格列表全部都是字符串内容,可以通过特定的TableModel或自己制定自己的单元格绘制器来实现
通常应当讲JTable对象放在JScrollPane容器由JSrollPane为JTable提供viewPort(不但可以为JTable增加转动条,而且可让JTable的标题显示出来,如果不把JTable放在JScorllPane中 JTable默许不会显示列标题)
与JList. JTree类似的是,JTable采取TableModel来保存表格中的所有状态数据,与ListModel类似的是,TableModel 也不强迫保存该表格显示的数据,
也能够通过TableModel对象来创建表格。
JTable使用TableColumnModel 来保存该表格所有数据列的状态数据,如果程序需要访问JTable的所有列状态信息,则可以通过获得该JTable的TableColumnModel来实现
使用JTable实现的表格并没有实现排序功能,但是可使用AbstactTableModel类来实现该功能,只要TableModel实现了getValueAt(),getColumnCount(),getRowCount(), JTable 就能够根据该TableModel生成表格,因此可以创建1个SortableTableModel实现类,将TableModel封装起来,并实现排序功能
上一篇 分布式系统Paxos算法
下一篇 粗浅看 XML