目录[-]
第一次写自己的博客,明知道写得很水,还是努力去写了,希望踏出第一步之后,能有着更好的发展。这几天看了一些资料,总结了一下自己所学的关于java swing的知识。
一、 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
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
|
import
java.awt.*;
import
java.awt.event.*;
import
javax.swing.*;
public
class
LookAndFeelDemo2
extends
JFrame {
private
JRadioButton radio1 =
new
JRadioButton(
"Metal"
);
private
JRadioButton radio2 =
new
JRadioButton(
"Windows"
);
private
JRadioButton radio3 =
new
JRadioButton(
"Motif"
);
private
JPanel panelNorth =
new
JPanel();
private
JPanel panelSouth =
new
JPanel();
private
JTextArea area =
new
JTextArea(
6
,
20
);
private
JButton btn =
new
JButton(
"button"
);
private
JCheckBox chk =
new
JCheckBox(
"checkBox"
);
private
JComboBox cmbLookAndFeel =
new
JComboBox(
new
String[] {
"Metal"
,
"Widows"
,
"Motif"
,
"GTK"
});
public
LookAndFeelDemo2(String title) {
super
(title);
Container contentPane =
this
.getContentPane();
ButtonGroup group =
new
ButtonGroup();
group.add(radio1);
group.add(radio2);
group.add(radio3);
panelNorth.add(radio1);
panelNorth.add(radio2);
panelNorth.add(radio3);
panelSouth.add(btn);
panelSouth.add(chk);
panelSouth.add(cmbLookAndFeel);
contentPane.add(panelNorth, BorderLayout.NORTH);
contentPane.add(area, BorderLayout.CENTER);
contentPane.add(panelSouth, BorderLayout.SOUTH);
pack();
setVisible(
true
);
setSize(
300
,
400
);
this
.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 监听Item事件
radio1.addItemListener(
new
MyItemListener());
radio2.addItemListener(
new
MyItemListener());
radio3.addItemListener(
new
MyItemListener());
}
private
class
MyItemListener
implements
ItemListener {
public
void
itemStateChanged(ItemEvent e) {
// 取得点击按钮的名字
String itemName = ((JRadioButton) e.getSource()).getText();
changeLookAndFeel(itemName);
}
}
// 设置外观的private类型方法
private
void
changeLookAndFeel(String name) {
String lookAndFeel =
""
;
if
(name.equals(
"Metal"
)) {
lookAndFeel =
"javax.swing.plaf.metal.MetalLookAndFeel"
;
}
else
if
(name.equals(
"Windows"
)) {
lookAndFeel =
"com.sun.java.swing.plaf.windows.WindowsLookAndFeel"
;
}
else
if
(name.equals(
"Motif"
)) {
lookAndFeel =
"com.sun.java.swing.plaf.motif.MotifLookAndFeel"
;
}
else
{
//取得默认的metal外观
lookAndFeel =
"javax.swing.plaf.metal.MetalLookAndFeel"
;
}
try
{
UIManager.setLookAndFeel(lookAndFeel);
// 运行时指定LookAndFeel,需要SwingUtilities.updateComponentTreeUI(Component
// c)实现动态的更新
SwingUtilities.updateComponentTreeUI(
this
);
area.setText(
"当前外观类名:\n"
+ lookAndFeel);
}
catch
(Exception ex) {
ex.printStackTrace();
}
}
public
static
void
main(String[] args) {
new
LookAndFeelDemo2(
"LookAndFeel"
);
}
}
|
![](http://static.oschina.net/uploads/space/2013/0614/103411_PEci_555796.jpg)
![](http://static.oschina.net/uploads/space/2013/0614/103433_LA38_555796.jpg)
![](http://static.oschina.net/uploads/space/2013/0614/103448_weax_555796.jpg)
三、 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的事件处理
a) Swing组件可以产生AWT包中的事件
b) 有自己的事件包(javax.swing.event)
c) Component类的五种事件
d) 能激活Container类的ContainerEvent事件的Swing组件
Swing组件中的容器(如:JFrame, JPane)
复合组件(如:JComboBox)