java swing 控件_Java Swing组件

本文详细介绍了Java Swing组件技术,包括Swing的特点、与AWT的区别、组件的MVC模型,以及如何设置和更改应用程序的LookAndFeel。此外,还讨论了Swing组件的使用注意事项,如避免混合使用Swing和AWT组件,并提供了示例代码演示如何在运行时动态改变外观。
摘要由CSDN通过智能技术生成

一、        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 }

eecb3ee3e72e3aacdb713557ba19b3fc.png015669452c75608119ce9d4b28ceaeee.png4721fa808f1360574804665181849993.png

三、        swing组件

1.swing组件的分类

aeeb644a5930603e3550314e0ae530c4.png

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

6bd2f9f8091ede8617f1d772cab4ce18.png

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)。

c73595019258b1af38aada15517a2924.png46d549bc1cb298f812821cc750c36b06.png

² 常用方法:

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指定组件是否被选中

a91fc2928d27c5e61e85999fb93d0caa.pngf574dc42ccd840419f186c2d8ee62030.png4d0bb3a06831c36479baa2ecafc49951.png

² 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为组合框的各个选项

446952b05d395ef6156358276afc0adf.png

² 常用方法:

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组件中;否则为多选效果

d2c15a486f2e2e2ca6d131746be6a3e4.png

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 最后再将工具条加入到内容面板中

00eae5e6af9dae0fda2b78f8384ecd72.png

9. JTabbedPane(选项卡窗格)

60283cc933244ca447c6c208cfb6b918.png

² 特性:它表现为一组文件夹页,每个文件夹都有标题(如下)

² 其内的每个页面为一个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中。

做方便实用的SWING控件! 欢迎大家测试并提交BUG报告. 由于个人能力和时间上的局限,希望有兴趣一起开发SWING控件的朋友,请与我联系.让我们一起努力! 为了方便查看,需要讨论的朋友请到另外一个置顶贴子. [讨论]关于"开源SWING控件" -------------------------------------------------------------------- 2004/03/25 首次发布 2004/04/08 把以前的组件和新做的组件合并到一个OpenSwing.jar文件中, 并初步将该组件库命名为”OpenSwing” 2004/06/17 加入了一个打印模板和一些新做的组件。 2004/07/25 加入了一个类似QQ界面的JGroupPane,修正了一些以前的组件的BUG. 对几乎所有的组件全部加入了JavaBeans处理, 使OpenSwing支持可视开发. 2005/04/17 将JNumberField最大长度,小数位长度修正成符合数据库定义的规范,如:NUMBER(10,2) 2005/04/21 修改了JNumberField的参数方式及不能输入负数的BUG,及数字验证方法 JDatePicker弹出时不能显示当前输入日期的BUG 加入了好多人在CJW论坛上贴子中想要的带关闭按钮的JCloseableTabbedPane可关闭的JTabbedPane的组件 2005/06/21 对JDatePicker加入了时分秒的输入 2006/01/20 修正了JPopupButton在XP风格下呈两个按钮样子的BUG 对JFontDialog进行了部分修改 2006/03/08 从JDatePicker提出来一个组件JCalendarPanel日期选择面板 并修改了JDatePicker的设计方式 2006/03/23 加入了韩文支持, 感谢在韩国工作的网友Sang Jian,韩文支持 OpenSwing_ko_KR.properties文件由他提供 2006/04/04 对JFileTree加入了文件过滤器建构式.并对显示进行了排序 -------------------------------------------------------------------- ■以下组件,均在j2sdk1.4.2_01+win2k环境下测试通过,继续欢迎大家测试并提交BUG报告. JCalendarPanel 日期选择面板, 从JDatePicker提出来的控件, 可以单独使用。 JCloseableTabbedPane 带关闭按钮/可设置菜单的JTabbedPane JDateField 日期输入框,输入正确格式的日期 JDatePicker 继承自JComboBox的日期选择框,保证输入正确格式的日期(yyyy-MM-dd) 履历: 2004/03/26 根据网友caiyj的建议引入了recoon写的关于JDateDocument的校验方法 2004/04/02 根据网友caiyj提交的BUG,修正了做为TableCellEditor时日期选择面板弹不出问题 JDirChooser 文件目录选择对话框 JFileTree 文件目录树 JFontDialog 字体对话框 JGroupPane 类似QQ界面的组群管理面板 JIpAddressField IP地址输入框,只能输入0~255数字的IP地址 JListChooser 列表选择对话框 JNumberField 数字输入框,可限制小数位数,数字最大长度,最大最小能输入的数字 JPopupButton 带下拉菜单的工具栏按钮 JStatusBar 模拟Windows的状态栏. JStringField 字符输入框,限制可输入的最大长度 JTreeComboBox 带有树形结构的下拉列表 com.sunking.swing.print.* 一个打印模板 -------------------------------------------------------------------- ■ OpenSwing的测试方法: 解压后是一个JBUILDER项目的目录结构,里面有一个test.bat文件和OpenSwing.jar(主库文件)/OpenSwingBeanInfo.jar(可视开发支持文件),直接执行test.bat进行测试。 ■ OpenSwing的发布: 只需要将OpenSwing.jar(主库文件)包含在CLASSPATH中即可。 OpenSwingBeanInfo.jar(可视开发支持文件)不需要发布, 仅提供可视化开发的支持 ■JBuilder上配置OpenSwing可视化开发组件 1.将OpenSwing.jar/ OpenSwingBeanInfo.jar文件复制到 %JBuilderX_HOME%\lib\ 目录下 2.打开JBuilderX 3.菜单Tools --> Configure Libraries…-->弹出Configure Libraries…对话框 ①New… --> Name中输入OpenSwing, Location中输入User Home -->OK ②选取对话框左边User Home下面出现的OpenSwing ③对话框右边Class和 Source页中分别做如下动作: Add…-->选择%JBuilder_HOME%\lib\OpenSwing.jar和OpenSwingBeanInfo.jar --> OK ④按OK关闭 Configure Libraries…对话框 4.菜单Tools--> Configure Palette… 弹出Palette Properties…对话框 ①Pages 页中按 Add… --> PageName中输入OpenSwing --> OK ②Add components页中 -->Select library…--> 选取User Home 下的OpenSwing类库-->OK ③Add components页中 -->在Component filtering块中选择 No filtering-->展开com.sunking.swing类包-->选择如下类: JGroupPanel,JStatusBar,JPopupButton,JDatePicker,JStringField,JNumberField,JFontDialog,JIpAddressField,JDateField (可按住Ctrl键复选)-->OK ④按OK关闭Palette Properties…对话框 5.配置成功标志: 随便打开一个JAVA文件,点下面的Design页,然后上面会出来一个设计工具条,诸如:Swing,Swing Containers…等,工具条的右上角有用来滚动工具栏的按钮,我们可以将其滚动到最末尾.如果看到有一个OpenSwing的页,并在它上面有几个可视组件的话,说明你已经配置成功了,开始你的OpenSwing可视开发之旅吧.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值