一、 java swing 组件技术简介
1.swing的特性
l 是AWT的扩展,swing比AWT提供了更多的组件和外观
l 它是纯java代码编写(除了JFrame、JDialog、JApplet),因此与平台无关
2.AWT的缺点
组件少而且是本地代码实现(无法实现跨平台)
3.swing 和 AWT相比
一个重要的的改进在于swing把一个组件的处理分为图形部分和数据处理部分(MVC模型)
l 图形部分由编程环境统一处理(View)
l 数据部分由一个数据处理模型进行处理(Model)
4.swing编程应注意的问题
l swing和AWT组件不要混合使用,可能会导致不能正常显示的错误
l 正确理解轻量级组件与重量级组件的不同
轻量级组件——swing组件,由纯java代码实现,占用系统资源少
重量级组件——AWT组件,有本地c代码实现,占用系统资源多
(注:JFrame、JDialog、JApplet(顶层容器)是重量级组件)
二、 swing的“外观和感觉”(LookAndFeel)
1.swing中常见的“LookAndFeel”
l Metal风格(默认)
javax.swing.plaf.metal.MetalLookAndFeel
l Windows风格
com.sun.java.swing.plaf.windows.WindowsLookAndFeel
l Windows Classic风格
com.sun.java.swing.plaf.windows.WindowsClassicLookAndFeel
l Motif风格
com.sun.java.swing.plaf.motif.MotifLookAndFeel
l Mac风格(需要在相关的操作系统上方可实现)
com.sun.java.swing.plaf.mac.MacLookAndFeel
l GTK风格(需要在相关的操作系统上方可实现)
com.sun.java.swing.plaf.gtk.GTKLookAndFeel
l 可跨平台的默认风格
UIManager.getCrossPlatformLookAndFeelClassName()
l 当前系统的风格
UIManager.getSystemLookAndFeelClassName()
意义:通过LookAndFeel机制,我们可以是程序的设计者任意转换程序的人机界面来对应不同的操作系统
2.设置swing的LookAndFeel
在swing中,采用UIManager类来管理swing界面的LookAndFeel,UIManager类提供静态方法setLookAndFeel()来设置界面的LookAndFeel,该方法是一个重载方法,提供两个重载方式:
setLookAndFeel(LookAndFeel newLookAndFeel)
setLookAndFeel( String className)
其中:参数newLookAndFeel表示组件的某种外观,className表示组件某种外观的名字
2-1.设置方法(静态设置,动态设置)
静态设置——设计时指定LookAndFeel
eg1:
String lookAndFeel = "javax.swing.plaf.metal.MetalLookAndFeel";
UIManager.setLookAndFeel(lookAndFeel);
eg2:
String lookAndFeel = UIManager.getCrossPlatformLookAndFeelClassName();
UIManager.setLookAndFeel(lookAndFeel);
动态设置——运行时指定LookAndFeel
eg:
UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName());
//运行时动态更新外观
SwingUtilities.updateComponentTreeUI(this)
附:SwingUtilities.updateComponentTreeUI(Component c)
对组件c重新设置外观
注:由于JFrame、JDialog、JApplet(顶层容器)为重量级组件,因此他们的外观只与操作系统平台有关系,在相同的操作系统平台下表现相同的外观
2-2.程序代码
1
2 import java.awt.*;3
4 import java.awt.event.*;5
6
7
8 import javax.swing.*;9
10
11
12 public class LookAndFeelDemo extendsJFrame {13
14
15
16 private JRadioButton radio = new JRadioButton("Metal");17
18 private JRadioButton radio = new JRadioButton("Windows");19
20 private JRadioButton radio = new JRadioButton("Motif");21
22 private JPanel panelNorth = newJPanel();23
24 private JPanel panelSouth = newJPanel();25
26 private JTextArea area = newJTextArea( , );27
28 private JButton btn = new JButton("button");29
30 private JCheckBox chk = new JCheckBox("checkBox");31
32 private JComboBox cmbLookAndFeel = new JComboBox(new String[] { "Metal",33
34 "Widows", "Motif", "GTK"});35
36
37
38 publicLookAndFeelDemo (String title) {39
40 super(title);41
42 Container contentPane = this.getContentPane();43
44 ButtonGroup group = newButtonGroup();45
46 group.add(radio );47
48 group.add(radio );49
50 group.add(radio );51
52
53
54 panelNorth.add(radio );55
56 panelNorth.add(radio );57
58 panelNorth.add(radio );59
60
61
62 panelSouth.add(btn);63
64 panelSouth.add(chk);65
66 panelSouth.add(cmbLookAndFeel);67
68
69
70 contentPane.add(panelNorth, BorderLayout.NORTH);71
72 contentPane.add(area, BorderLayout.CENTER);73
74 contentPane.add(panelSouth, BorderLayout.SOUTH);75
76 pack();77
78
79
80 setVisible(true);81
82 setSize( , );83
84 this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);85
86
87
88 //监听Item事件
89
90 radio .addItemListener(newMyItemListener());91
92 radio .addItemListener(newMyItemListener());93
94 radio .addItemListener(newMyItemListener());95
96
97
98 }99
100
101
102 private class MyItemListener implementsItemListener {103
104
105
106 public voiditemStateChanged(ItemEvent e) {107
108 //取得点击按钮的名字
109
110 String itemName =((JRadioButton) e.getSource()).getText();111
112 changeLookAndFeel(itemName);113
114 }115
116 }117
118
119
120 //设置外观的private类型方法
121
122
123
124 private voidchangeLookAndFeel(String name) {125
126
127
128 String lookAndFeel = "";129
130 if (name.equals("Metal")) {131
132 lookAndFeel = "javax.swing.plaf.metal.MetalLookAndFeel";133
134
135
136 } else if (name.equals("Windows")) {137
138 lookAndFeel = "com.sun.java.swing.plaf.windows.WindowsLookAndFeel";139
140 } else if (name.equals("Motif")) {141
142 lookAndFeel = "com.sun.java.swing.plaf.motif.MotifLookAndFeel";143
144 }else{145
146 //取得默认的metal外观
147
148 lookAndFeel = "javax.swing.plaf.metal.MetalLookAndFeel";149
150 }151
152
153
154 try{155
156 UIManager.setLookAndFeel(lookAndFeel);157
158 //运行时指定LookAndFeel,需要SwingUtilities.updateComponentTreeUI(Component159
160 //c)实现动态的更新
161
162 SwingUtilities.updateComponentTreeUI(this);163
164 area.setText("当前外观类名:\n" +lookAndFeel);165
166 } catch(Exception ex) {167
168 ex.printStackTrace();169
170 }171
172
173
174 }175
176
177
178 public static voidmain(String[] args) {179
180 new LookAndFeelDemo ("LookAndFeel");181
182 }183
184 }
三、 swing组件
1.swing组件的分类
2.往swing容器里添加组件
对于swing顶层容器(JFrame,JDialog,JApplet),在添加组件时,不能直接调用容器的add()方法。
往顶层容器添加组件可用以下方法:
a) 通过getContentPane()方法获得当前容器的内容面板对象,在调用容器的add()方法加入各个组件
b) 先利用JPanel类生成一个内容面板对象panel,再将各个组件加入到panel中,然后调用的容器的setContentPane()方法,将panel加入到当前容器中
3.使用swing组件的基本规则
a) 把swing组件放入一个顶层容器中
b) 避免使用非swing的重量级组件
c) 往swing顶层容器添加组件时,不能直接调用add()方法
d) 内容面板缺省的布局策略是BorderLayout,不能对顶层容器进行布局
二、 常用的swing组件和容器
1.JFrame
² 顶层容器,默认不可见;默认布局方式为BorderLayout
² 构造函数:
l JFrame()
l JFrame(String title)//title 为框架的标题内容
² JFrame常用方法
l setDefaultCloseOperation(int operation)—设置关闭框架的行为
参数operation一般是JFrame. EXIT_ON_CLOSE,表示关闭框架时,则退出程序
l setSize(int width, int height)— 设置框架的大小
l setVisible(boolean b)—设置框架是否可见,默认为false
l getContentPane()—获取顶层容器的内容面板
l add(Component comp)—往内容面板添加组件
l setLayout(LayoutManager mgr)—设置布局方式,默认为BorderLayout
2.JDialog 和 JOptionPane
a) JDialog
² 在已有的窗口上创建对话框,可以使用此类创建自定义的对话框
² 构造函数:
JDialog(Dialogowner,Stringtitle, boolean modal)
JDialog(Frameowner,Stringtitle, boolean modal)
参数:owner—指定对话框的父窗口
title—对话框的标题
modal—对话框的模式(true为“有模式对话框”,false为“无模式对话框”
² JDialog常用方法
n setSize(int width, int height)— 设置对话框的大小
n getContentPane()—获取顶层容器的内容面板
n add(Component comp)—往内容面板添加组件
n setLayout(LayoutManager mgr)—设置布局方式,默认为BorderLayout
b) JOptionPane
² 提供一些现成的、各种常用的标准对话框(有模式的对话框)
²JOptionPane类里静态方法众多,但几乎所有静态方法都遵循showXxxDialog()的形式,如下:
方法名
描述
showConfirmDialog()
显示确认对话框
showInputDialog()
显示输入文本对话框
showMessageDialog()
显示信息对话框
showOptionDialog()
显示选择性的对话框
这四种方法的参数都遵循一致的模式:
①ParentComponent:指示对话框的父窗口对象,一般为当前窗口。也可以为null即采用缺省的Frame作 为父窗口,此时对话框将设置在屏幕的正中。
②message:指示要在对话框内显示的描述性的文字
③String title:窗口标题
④Component:在对话框内要显示的组件(如按钮)
⑤Icon:在对话框内要显示的图标
⑥messageType:定义 message 的样式,一般可以为如下的值
n ERROR_MESSAGE
n INFORMATION_MESSAGE
n WARNING_MESSAGE
n QUESTION_MESSAGE
n PLAIN_MESSAGE
⑦ optionType:定义在对话框的底部显示的选项按钮的集合。一般可以为
n DEFAULT_OPTION
n YES_NO_OPTION
n YES_NO_CANCEL_OPTION
n OK_CANCEL_OPTION。
² 当showXxxDialog 方法返回整数时,可能的值为:
n YES_OPTION
n NO_OPTION
n CANCEL_OPTION
n OK_OPTION
n CLOSED_OPTION
3.JLabel
² 构造函数;
n JLabel()
n JLabel(String text)
n JLabel(Icon image)
n JLabel(String text, Icon icon, int horizontalAlignment)
其中参数text为JLabel的文字信息,image为JLabel的图标,horizontalAlignment为文字与图标在水平方向上的对齐方式,常见的取值有常量 JLabel.LEFT(左对齐),JLabel.CENTER(中对齐), JLabel.RIGHT(右对齐),
² JLabel常用方法:
n setText(String text)—设置文字信息
n setIcon(Icon image)—设置JLabel的图标
n setHorizontalAlignment(int alignment)—设置文字与图标在水平方向的对齐方式
n setVerticalAlignment(int alignment)—设置文字与图标在竖直方向的对齐方式
n setToolTipText(String text)—在JLabel上停留时出现的提示信息
4.JTextField 和 JPasswordField
² 都是用来编辑单行文本,JTextField可以直接看到输入的字符,JPasswordField将输入的字符表示成”*”
² 构造函数:
JTextField()
JPasswordField()
JTextField(String text)
JPasswordField(String text)
JTextField(int columns)
JPasswordField(int columns)
JTextField(String text, int columns)
JPasswordField(String text, int columns)
参数text指定文本编辑框显示的初始文本,columns为文本编辑框的宽度(大于0)。
² 常用方法:
getText()—获取编辑框的文本信息(String 类型)
setText(String text)—设置文本信息
setEditable(boolean b)—设置是否可编辑
5.JButton、JCheckBox(复选框)和JRadioButton(单选按钮)
² 触击式组件(单击这三个组件,都能触发特定的的事件。)
JButton——命令式事件 ·
JCheckBox、JRadioButton—选择状态发生变化
² 构造函数:
JButton()
JButton(Icon icon)
JButton(String text)
JCheckBox()
JRadioButton()
JCheckBox(Stringtext,Iconicon, boolean selected)
JRadioButton(Stringtext,Iconicon, boolean selected)
参数text为指定组件显示的文本信息,icon为指定组件的图标,selected指定组件是否被选中
² JCheckBox、JRadioButton常用方法:
setSelected(boolean b)—设置组件的选中状态
isSelected()—判断组件时否被选中
² 与ButtonGroup对象配合使用可创建一组按钮,一次只能选择其中的一个按钮。ButtonGroup提供的一个空的构造方法,使用成员方法add(AbstractButton b)添加单选按钮( JRadioButton是AbstractButton的子类)
² 如果需要把多个JRadioButton排成一排或者一列,可以创建一个布局为GridLayout或者BoxLayout的JPanel。
如:JPanel jpanel = new JPanel(new GridLayout(0,1));//排成一列
jpanel.add(JRadioButton);
6.JComboBox(组合框),JList,JTextArea和JScrollPane
² 用于显示多行文本的组件
(一) JComboBox(组合框)
² 构造函数:
JComboBox(Object[] items)
参数items为组合框的各个选项
² 常用方法:
setEditable(boolean aFlag)—设置组合框是否可以自行输入一行文本信息,默认为false。当为false时,只能选择组合框中的某个选项
setMaximumRowCount(int count)—设置显示的最大行数
setSelectedIndex(int anIndex)—选择索引第anIndex+1处的选项
getSelectedIndex()—返回列表中与给定项匹配的第一个选项的下标值
getSelectedItem()—返回当前所选项。
getSelectedObjects()—返回包含所选项的数组。
(二) JList(列表框)
² 构造函数:
JList(Object[] listData)
参数listData为列表框的各个选项
² 常用方法:
setSelectionMode(int selectionMode)—设置列表的选择模式。
selectionMode常为以下常数:
ListSelectionModel.SINGLE_SELECTION- 一次只能选择一个列表选项
ListSelectionModel.SINGLE_INTERVAL_SELECTION- 一次只能选择一个连续间隔
ListSelectionModel.MULTIPLE_INTERVAL_SELECTION –一次可选择一个或多个选项。此模式是默认设置。
setSelectedIndex(int index)—设置被选中的选项
getSelectedIndex()—返回最小的选择单元的索引
(三) JTextArea (文本区域)
² 构造函数;
JTextArea(Stringtext, int rows, int columns)
构造具有指定文本text、rows行columns列的 TextArea
7.菜单编写
² 相关的类:
通过JMenuBar类(利用setJMenuBar()方法加入窗口中)
JMenu(级联)
JMenuItem(菜单项目)
JCheckBoxMenuItem(选择性的菜单项目)
JRadioButtonMenuItem(选择性的菜单项目(圆点))。
² 编程要点:
a)、产生快捷键
mnuFileNew.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_1, ActionEvent.ALT_MASK));//快捷键alt+1
b)、添加分割条
mnuFile.addSeparator();
c)、给菜单加上图标
mnuFileNew.setIcon(newImageIcon("new.gif"));
d)、给菜单加上助记符
mnuFile.setMnemonic('F'); //alt+F
e)、要使得多个JRadioButtonMenuItem项目产生单选的效果,可以将它们放入一个ButtonGroup组件中;否则为多选效果
8.工具条JToolBar
² 在Swing中的窗口工具条是由JToolBar来实现,它也是一种容器并按照行或列对组件(它们一般为按钮)进行分组。
² 缺省时为水平方向但可以使用SwingConstants. HORIZONTAL或者SwingConstants. VERTICAL来设置其方向。
² 构造函数:
n JToolBar() 创建出水平方向的工具条(缺省为HORIZONTAL)。
n JToolBar(int orientation) 创建出指定方向的工具条。
n JToolBar(String name) 创建出指定名称的工具条。
n JToolBar(String name, int orientation) 创建出指定方向和名称的工具条。
² 工具条上的工具按钮的事件编程:
类似于一般的按钮事件编程,可以分别为各个不同的按钮单独进行事件编程。
² 编程方法:
n 创建出JToolBar对象
n 然后采用add(Object)方法将组件(可以为按钮或其它组件)加入到工具条中。
n 最后再将工具条加入到内容面板中
9. JTabbedPane(选项卡窗格)
² 特性:它表现为一组文件夹页,每个文件夹都有标题(如下)
² 其内的每个页面为一个JPanel类或者其子类的对象
² 构造函数:
public JTabbedPane(int tabPlacement, int tabLayoutPolicy)
其中Tabplacement可以是:
² JTabbedPane.TOP(表头在上面)
² JTabbedPane.BOTTOM(表头在下面)
² JTabbedPane.LEFT(表头在左面)
² JTabbedPane.RIGHT(表头在右面)。
TablayoutPolicy可以是
² JTabbedPane.WRAP_TAB_LAYOUT(表头不产生SCROLL效果)
² JTabbedPane.SCROLL_TAB_LAYOUT(表头产生SCROLL效果)
² 编程方法:
创建出JTabbedPane类的对象;
l 调用addTab()方法加入一个页面组件(JPanel或其子类);
l 最后将JTabbedPane类的对象加入到顶级容器的ContentPane中。