65
1 第第第 第第第 Swing Swing 第第第第第第 第第第第第第 广广广广广广广广广广广

第七章 Swing 用户界面组件

Embed Size (px)

DESCRIPTION

第七章 Swing 用户界面组件. 广东工业大学计算机学院. 本章内容. 7.1 布局管理器概述 7.2 常用组件介绍 文本输入 选择组件和单选按钮 菜单 工具栏. 7.3 对话框 对话框简介 选项对话框 文件对话框 颜色对话框. 什么是布局管理器. 当往窗口中放置组件时,首先要指定组件的放置策略。 布局管理器: 解决如何将组件安排在一个框架或面板内的问题。 三种最简单的 布局管理器 : 流布局管理器 ( flow layout manager) 边界布局管理器 ( border layout manager) - PowerPoint PPT Presentation

Citation preview

Page 1: 第七章 Swing 用户界面组件

1

第七章第七章

SwingSwing 用户界面组件用户界面组件

广东工业大学计算机学院

Page 2: 第七章 Swing 用户界面组件

广东工业大学计算机学院2

本章内容本章内容

7.1 布局管理器概述

7.2 常用组件介绍 文本输入 选择组件和单选按钮 菜单 工具栏

7.3 对话框 对话框简介 选项对话框 文件对话框 颜色对话框

Page 3: 第七章 Swing 用户界面组件

广东工业大学计算机学院3

什么是布局管理器什么是布局管理器

当往窗口中放置组件时,首先要指定组件的放置策略。

布局管理器:解决如何将组件安排在一个框架或面板内的问题。

三种最简单的布局管理器: 流布局管理器 (flow layout manager) 边界布局管理器 (border layout manager) 网格布局管理器 (grid layout manger)

Page 4: 第七章 Swing 用户界面组件

广东工业大学计算机学院4

1. 1. 流布局管理器流布局管理器

流布局管理器 (flow layout manager) 将组件按加入的先后次序从左至右排列在面板中。

在 Java API 库中,流布局管理器对应的类是FlowLayout ,它有 3 个构造器: FlowLayout() :居中对齐,水平间距和垂直间距都是 5 个像

素。 FlowLayout(int align) :指定对齐方式 align ,水平间距和垂

直间距都是 5 个像素。 FlowLayout(int align, int hGap, int vGap) :指定对齐方式

align 、水平间距和垂直像素。

对于对齐方式,可以用 FlowLayout 类中的以下属性指定: LEFT / CENTER / RIGHT :左对齐 / 居中对齐 / 右对齐

Page 5: 第七章 Swing 用户界面组件

广东工业大学计算机学院5

流布局管理器的使用效果流布局管理器的使用效果

JPanel 容器类默认使用的布局管理器是流布局管理器。 按钮居中显示在一行中,当一行空间不够时,就显示在

新的一行上。如图所示: 用户对框架进行拖动缩放,这些按钮也会显示在面板的

中央。

演示FlowLayoutTest.java

Page 6: 第七章 Swing 用户界面组件

广东工业大学计算机学院6

2. 2. 边界布局管理器边界布局管理器

边界布局管理器 (border layout manager) 把一个容器 ( 例如panel) 分成 North 、 West 、 Center 、 East 、 South 五部分,对应的类是 BorderLayout 。

例:使用边界布局管理器,将一个Button 放在 South 位置。 panel.setLayout(new

BorderLayout()); panel.add(aButton,

BorderLayout.SOUTH);

BorderLayout 是 Window 、 Frame

和 Dialog 缺省的布局管理器。

Page 7: 第七章 Swing 用户界面组件

广东工业大学计算机学院7

效果举例效果举例

仅使用 BorderLayout 来定位组件往往不能准确定位组件。下图显示了上一个页面中代码的执行结果: 按钮自动扩展到填满框架的整个 South 区域;而且

如果再往 South 区域添加一个新按钮时,旧按钮就会被替换掉。

panel.setLayout(new BorderLayout());

panel.add(aButton, BorderLayout.SOUTH);

Page 8: 第七章 Swing 用户界面组件

广东工业大学计算机学院8

面板嵌套面板嵌套

可以通过面板嵌套来解决这个问题:1. 创建一个新 panel ,命名为 southPanel 。2. 在 southPanel 中设置按钮的布局方式,向 southPanel 中添

加按钮。3. 添加 southPanel 至 South 区域。

JPanel southPanel = new southPanel();

southPanel.add(yBt); southPanel.add(bBt); southPanel.add(rBt); panel.setLayout(new

BorderLayout()); panel.add(southPanel,

BorderLayout.SOUTH);

演示 BorderLayoutTest.java

Page 9: 第七章 Swing 用户界面组件

广东工业大学计算机学院9

网格布局管理器网格布局管理器

网格布局管理器 (grid layout manger) :这种布局是将容器分成单元格,每个单元格的大小都一样。例如: panel.setLayout(new GridLayout(2, 3));

将面板分成 2 行和 3 列,然后将组件添加到单元格中: panel.add(new JButton(“1”)); panel.add(new JButton(“2”));

组件的添加顺序是从第一行第一列开始,接着是第一行第二列……

网格布局布局管理器总是忽略组件的最佳大小。所有单元的宽度和高度是相同的,是根据单元数对可用宽度和高度进行平分而定。

Page 10: 第七章 Swing 用户界面组件

广东工业大学计算机学院10

举例:计算器程序举例:计算器程序

制作一个如图所示的计算器程序。 使用面板嵌套技术:

一个子面板,置于根面板的 CENTER ,该子面板内使用GridLayout 布局。

一个用于显示计算结果的按钮,使用BorderLayout 放置于 North

Page 11: 第七章 Swing 用户界面组件

广东工业大学计算机学院11

布局管理器小结布局管理器小结

布局管理器主要应用于容器类中。其一般使用步骤如下: 1. 获得容器类对象。 例如: JPanel parentPanel = new JPanel();

2. 对该容器类对象设置布局管理器。 例如: panel.setLayout(new GridLayout(2, 3));

3. 根据布局管理器的特性,将组件放置于适当的位置。 例如: panel.add(new JButton(“1”));

4. 如果需要获得更加精确的布局,可以使用容器类的嵌套。

Page 12: 第七章 Swing 用户界面组件

广东工业大学计算机学院12

复杂的布局管理器复杂的布局管理器

除了这些简单的布局管理器, Java 还提供了一系列功能更加强大,使用起来也更加复杂的管理器:

1. 箱式布局管理器 (BoxLayout)

2. 网格组布局管理器 (GridbagLayout)

3. 弹簧布局管理器 (SpringLayout)

另外,用户还可以自定义布局管理器。 详细介绍参考《 java2核心技术卷 I 》 P393

Page 13: 第七章 Swing 用户界面组件

广东工业大学计算机学院13

1. 1. 箱式布局管理器箱式布局管理器

箱式布局管理器(BoxLayout) :用于布局单行或者单列组件。

布局策略:将组件按行或者列排列。如果组件的最小宽度之和大于箱的宽度,则不显示某些组件。组件之间的间隔要手动添加。

Page 14: 第七章 Swing 用户界面组件

广东工业大学计算机学院14

2.2. 网格组布局管理器网格组布局管理器

网格组布局管理器 (GridbagLayout) :“没有限制的网格布局”。

特点:可以改变行和列的的尺寸;大的组件可以占用多行或多列。

Page 15: 第七章 Swing 用户界面组件

广东工业大学计算机学院15

3. 3. 弹簧布局管理器弹簧布局管理器

弹簧布局管理器 (SpringLayout) :提供一种在一定范围内,灵活设定组件间距的布局策略。

弹簧具有:最小值、首选值、最大值、实际值。

当容器大小发生改变时,组件间距也会在弹簧的最大值和最小值之间发生改变。

Page 16: 第七章 Swing 用户界面组件

广东工业大学计算机学院16

本章内容本章内容

7.1 MVC模式

7.2 布局管理器概述

7.3 常用组件介绍 文本输入 选择组件和单选按钮 菜单 工具栏

7.4 对话框 对话框简介 选项对话框 文件对话框 颜色对话框

Page 17: 第七章 Swing 用户界面组件

广东工业大学计算机学院17

1.1. 文本输入文本输入

文本域 (JTextField) 和文本区 (JTextArea) :用于获取文本输入。 JTextField :接收单行文本输入。 JTextArea : 接收多行文本输入。 JPasswordField :特殊的文本域,用户的输入不直接显示出来,而

用其它字符代替,常用于输入密码。(自学)

文本域的使用方法: JPanel panel = new JPanel(); JTextField textField = new JTextField("Default input", 20); panel.add(textField);

第一个参数“ Default input” :将文本域的缺省显示值为 Default input

第二个参数 20 :列数,是指文本域显示的宽度为 20 列(并非可以输入的字符的个数)。

Page 18: 第七章 Swing 用户界面组件

广东工业大学计算机学院18

文本域文本域 JTextFieldJTextField 的常用函数的常用函数

Java.swing. JTextField

JTextField(int cols) 构造一个指定列数的空 JTextField

JTextField(String text , int cols) 构造一个指定列数,指定初始字符串的 JTextField

void setColumns(int cols) 设置文本域使用的列数

Page 19: 第七章 Swing 用户界面组件

广东工业大学计算机学院19

文本区(文本区( JTextAreaJTextArea ))

文本区 JTextArea 组件可以让用户输入多行文本。在JTextArea 组件中,可以指定文本区的行数和列数: textArea = new JTextArea(8, 40); // 8 行 40 列

一行的结尾为’ \n’(回车)符 如果文本区的文本超出显示范围,则

其余的文本会被剪裁。

可以使用换行来避免行过长: textArea.setLineWrap(true);

在 Swing 中,文本区没有滚动条,需要手动安装: JScrollPane scrollPane = new

JScrollPane(textArea)

演示 TextAreaTest.java

Page 20: 第七章 Swing 用户界面组件

广东工业大学计算机学院20

文本域文本域 JTextAreaJTextArea 的常用函数的常用函数

Java.swing. JTextArea

JTextArea(int rows, int cols) 构造一个 rows 行 cols 列的新的文本区

JTextArea(String text , int rows, int cols) 用初始文本构造一个新的文本区

void setRows(int rows) 设置文本域使用的行数

void append(String newText) 将给定文本附加到文本区中已有文本的后面

void setLineWrap(boolean wrap) 打开或关闭换行

Java.swing. JScrollPane

JScrollPane(Component c) 在组件 c 上添加滚动条,返回添加后的组件

Page 21: 第七章 Swing 用户界面组件

广东工业大学计算机学院21

文本域与文本区的常用方法文本域与文本区的常用方法

Java.swing.text.JTextComponent

void setText(String t) 用新文本改变文本组件中的文本

String getText() 返回文本组件中的文本

void setEditable(boolean b) 确定用户是否可以编辑 JTextComponent 中的内容

Java.swing. JComponent

void revalidate( ) 重新计算容器内所有组件的大小和位置,并对它们重新布局 如 panel.revalidate()

Page 22: 第七章 Swing 用户界面组件

广东工业大学计算机学院22

标签组件(标签组件( JLabelJLabel ))

标签是容纳文本的组件。它们没有任何修饰(例如没有边界),也不响应用户输入。

标签的常用用途之一就是标识组件,例如标识文本域。其使用步骤如下:

1. 创建一个 JLabel 组件例: JLabel label = new JLabel(“hours”, SwingConstants.RIGHT);或者 JLabel label = new JLabel(“hours”, JLabel.RIGHT);

上面的代码创建了一个 label ,并指定 label 的对齐方式为右对齐。

2. 将标签组件放置在离标识的组件足够近的地方。

Page 23: 第七章 Swing 用户界面组件

广东工业大学计算机学院23

实例:一个可以设置时间的钟实例:一个可以设置时间的钟

本程序演示了一个可以设置时间的钟。 当用户在文本域中输入相应的小时和分钟数值时,时钟就将长针

和短针绘制出来。

本程序需要监视文本域的变化。

文本类组件(继承 JTextComponent 的组件)由文本模型( Document 接口)来捕捉,获得文本模型的方法是:

Document getDocument( ); //JTextComponent

再在文本模型安装文档监听器 (document listener) 能够监听文本域变化事件。

Page 24: 第七章 Swing 用户界面组件

广东工业大学计算机学院24

实例的关键代码实例的关键代码

当文本发生改变后,文档监听器 (document listener)能够监听到该事件的发生,并调用 DocumentListener接口中的下列方法之一: void insertUpdate(DocumentEvent event) void removeUpdate(DocumentEvent event) void changedUpdate(DocumentEvent event)

当添加或者删除字符时,应该调用前两个方法。

所以文档监听器 (document listener)必须实现这三个方法: void insertUpdate(DocumentEvent event) { setClock(); } void removeUpdate(DocumentEvent event) { setClock(); } void changedUpdate(DocumentEvent event) { }

Page 25: 第七章 Swing 用户界面组件

广东工业大学计算机学院25

本章内容本章内容

7.1 布局管理器概述

7.2 常用组件介绍 文本输入 选择组件和单选按钮 菜单 工具栏

7.3 对话框 对话框简介 选项对话框 文件对话框 颜色对话框

Page 26: 第七章 Swing 用户界面组件

广东工业大学计算机学院26

2. 2. 选择组件选择组件

常见的选择组件有:复选框、单选按钮、选项列表以及滑块等。

1). 复选框 JCheckBox 如果想要接收的输入只有“是”或“非”两者的话,可

以使用复选框组件。这种组件缺省带有标识标签。

在构造器中可以指定该标签的文本: bold = new JCheckBox(“Bold”);

用户点击复选框的动作监听器为实现 ActionListener 接口。( actionPerformed 方法)

Page 27: 第七章 Swing 用户界面组件

广东工业大学计算机学院27

复选框实例:监听器使用复选框实例:监听器使用

实例:使用选中的字型显示字符串。

…… bold = new JCheckBox(“Bold”); italic = new JCheckBox(“Italic”);

……. class CheckBoxListener implement ActionListener{ public actionPerformed(ActionEvent event){ } } …… CheckBoxListener listener = new CheckBoxListerner(); bold. addActionListener(listener) ; italic. addActionListener(listener)

演示 CheckBoxTest.java

Page 28: 第七章 Swing 用户界面组件

广东工业大学计算机学院28

复选框复选框 JCheckBoxJCheckBox 的常用函数的常用函数

Java.swing. JCheckBox

JCheckBox(String label) 用给定的标签构造一个复选框

JCheckBox(String label, boolea state) 用给定的标签和初始化状态构造一个复选框

boolean isSelected( ) 返回复选框状态

void setSelected(boolean state) 为复选框设置状态

Page 29: 第七章 Swing 用户界面组件

广东工业大学计算机学院29

2). 2). 单选按钮单选按钮

单选按钮 (radio button group) :提供一组选择项,用户在任何时刻只能选择一个选择项,每个选项都带有一个标签。

在 Swing 中实现单选按钮对象的步骤: 1. 创建一个 ButtonGroup 对象

ButtonGroup group = new ButtonGroup();

2. 将 JRadioButton 对象添加到按钮组中, ButtonGroup 对象负责当新按钮被按下时,取消前一个按下的操作。 JRadioButton smallButton = new JRadioButton("Small", false); group.add(smallButton);

JRadioButton mediumButton = new JRadioButton("Medium", true); group.add(mediumButton);

3. 将多个单选按钮添加到面板时 要一个个添加 panel. add(smallButton) ; panel. Add(mediumButton);

Page 30: 第七章 Swing 用户界面组件

广东工业大学计算机学院30

单选按钮实例:监听器使用策略单选按钮实例:监听器使用策略

用户点击单选按钮的动作监听器为实现 ActionListener接口( actionPerformed 方法)的类对象。

方法一:如果各个单选按钮中的按钮的行为相似,可以让它们共享一个监听器。(需要在动作监听器中判断哪一个按钮被选中,然后才能作出响应)

方法二:单选按钮的每个按钮对象设置其独有的监听器。(推荐)

Page 31: 第七章 Swing 用户界面组件

广东工业大学计算机学院31

单选按钮实例:监听器使用单选按钮实例:监听器使用

实例:当选中不同的按钮时,使用不同的字体显示字符串。

演示 RadioButtonTest.java

Page 32: 第七章 Swing 用户界面组件

广东工业大学计算机学院32

请自学 边界( Border) 组合框( JComboBox) 滑块( JSlider) 微调控制器( JSpinner)

Page 33: 第七章 Swing 用户界面组件

广东工业大学计算机学院33

本章内容本章内容

7.1 布局管理器概述

7.2 常用组件介绍 文本输入 选择组件和单选按钮 菜单 工具栏

7.3 对话框 对话框简介 选项对话框 文件对话框 颜色对话框

Page 34: 第七章 Swing 用户界面组件

广东工业大学计算机学院34

4. 4. 菜单菜单

菜单的创建可以遵循以下步骤: 1. 创建一个菜单栏

JMenuBar menuBar = new JMenuBar();

2. 将菜单栏放置在 frame 的顶部。 frame.setMenuBar(menuBar);

3. 为每个菜单建立一个菜单对象 JMenu editMenu = new JMenu(“Edit”);

4. 将顶层菜单添加到菜单栏中 menuBar.add(editMenu);

菜单栏

菜单

菜单项

子菜单项

Page 35: 第七章 Swing 用户界面组件

广东工业大学计算机学院35

4. 4. 菜单菜单 (( 续续 ))

菜单的创建可以遵循以下步骤(续): 5. 往菜单对象中添加菜单项、分隔符和子菜单

JMenuItem pasteItem = new JMenuItem("Paste"); editMenu.add(pasteItem) 等价于使用 JMenu.add(String) 方法将菜单项插入到菜单的末尾 JMenuItem pasteItem = editMenu.add("Paste");

editMenu.addSeparator(); JMenu optionsMenu = new JMenu(“Options”). . .; // 一个子菜单 editMenu.add(optionsMenu);

6. 用户点击菜单项的动作监听器为实现 ActionListener 接口( actionPerformed 方法)的类对象或关联一个动作事件:

ActionListener listener = . . . ; pasteItem.addActionListener(listener);

或将一个动作直接与菜单项关联 ActionListener pasteAction = … ; JMenuItem cutItem=new JMenuItem(cutAction); editMenu.add(pasteAction) ;

Page 36: 第七章 Swing 用户界面组件

广东工业大学计算机学院36

菜单中的图标菜单中的图标

JMenuItem 类扩展自 AbstractButton 类,故菜单项与按钮很相似。有 3 种方法为菜单项指定一个图标:

1. 构造器方法 JMenuItem cutItem = new JMenuItem(“Cut”, new ImageIcon(“cut.gif”); // 默认图形在名称的左侧

2. setIcon 方法 cutItem.setIcon(new ImageIcon(“cut.gif”);

3. 把一个图标添加到一个动作上,再用该动作构造菜单项cutAction.putValue(Action.SMALL_ICON, new ImageIcon(“cut.gif”));JMenuItem cutItem = new JMenuItem(cutAction);

使用动作构造菜单项时, Action.NAME 将会成为菜单项的文本,而 Action.SMALL_ICON 成为图标。

Page 37: 第七章 Swing 用户界面组件

广东工业大学计算机学院37

弹出菜单弹出菜单

弹出菜单 (pop-up menu) :即单击鼠标右键可弹出的快捷菜单。

建立弹出菜单的方法与一般菜单相似: (1) 创建一个弹出式菜单 JPopupMenu popup = new JPopupMenu();

(2) 在菜单中添加菜单项: JMenuItem item = new JMenuItem("Cut"); item.addActionListener(listener); popup.add(item);

Page 38: 第七章 Swing 用户界面组件

广东工业大学计算机学院38

弹出式触发器弹出式触发器

弹出式触发器 (pop-up trigger) :用户点击鼠标某个键时,弹出菜单。

在 Windows 或者 Linux 中,弹出式触发器是右键。

要想在用户点击某一个组件的时候弹出菜单,就要使用弹出式触发器: component.setComponentPopupMenu(popup);

Page 39: 第七章 Swing 用户界面组件

广东工业大学计算机学院39

快捷键快捷键

可以为菜单项设置快捷键。在当前菜单打开的情况下,可以按下某菜单项的快捷键,相当于鼠标单击了该菜单项。

JMenuItem CutItem=new JMenuItem(“Index”); CutItem.setMnemonic(“I”);

快捷键就会自动显示在菜单项中,快捷键下面有一条下划线。

Page 40: 第七章 Swing 用户界面组件

广东工业大学计算机学院40

加速器加速器

加速器可以在不打开菜单的情况下选中菜单项的快捷键。 例如,很多程序把 CTRL + O 和 CTRL + S关联到菜单

中的 Open 和 Save 项。 使用 SetAccelerator 方法可以将加速器关联到一个菜

单项。该方法使用 KeyStroke 类型的对象作为参数。例如: openItem.setAccelerator(KeyStroke.getKeyStroke(KeyEv

ent.VK_O, InputEvent.CTRL_MASK));

当用户按下加速器组合键时,就自动选择了相应的菜单项,同时激活一个动作事件。

注意:加速器实际上并不打开菜单,而是直接激活菜单关联的动作事件。

Page 41: 第七章 Swing 用户界面组件

广东工业大学计算机学院41

启用和禁用菜单项启用和禁用菜单项

在程序运行过程中,经常需要屏蔽某些暂时不适用的命令,待到条件允许时再使之重新可用。

屏蔽 /启用菜单项的方法: aMenuItem.setEnabled(boolean) 当参数值为 false 时,屏蔽该菜单项; 当参数值为 true 时,启用该菜单项;

如果需要动态启用 /屏蔽某菜单项,则需要为“ menu selected”事件注册监听器。 javax.swing.event包定义了 MenuListener 接口,它有三个方法: void menuSelected(MenuEvent event) void menuDeselected(MenuEvent event) void menuCanceled(MenuEvent event)

Page 42: 第七章 Swing 用户界面组件

广东工业大学计算机学院42

监听“监听“ menu selected”menu selected” 事件事件

只需要监听“ menu selected”事件,当一个菜单被选中时,将菜单中包含的需要被屏蔽的菜单项屏蔽掉即可。

例如下列代码可屏蔽 /打开 Save 按钮和 Save As 按钮。 public void menuSelected(MenuEvent event) { saveAction.setEnabled(!readonlyItem.isSelected()); saveAsAction.setEnabled(!readonlyItem.isSelected()); }

注意:此处不使用仅用 Save 和 Save As 菜单项是因为对于拥有加速键的菜单项,即使菜单项被屏蔽,也可以使用加速键直接激发菜单项关联的动作事件。

Page 43: 第七章 Swing 用户界面组件

广东工业大学计算机学院43

练习:创建一组菜单练习:创建一组菜单

演示MenuTest

Page 44: 第七章 Swing 用户界面组件

广东工业大学计算机学院44

本章内容本章内容

7.1 布局管理器概述

7.2 常用组件介绍 文本输入 选择组件和单选按钮 菜单 工具栏

7.3 对话框 对话框简介 选项对话框 文件对话框 颜色对话框

Page 45: 第七章 Swing 用户界面组件

广东工业大学计算机学院45

5. 5. 工具栏工具栏

工具栏是在程序中提供快速访问常用命令的按钮栏。

工具栏的特别之处在于可以移动,脱离工具栏或拖拽到框架其他地方,如图所示。

Page 46: 第七章 Swing 用户界面组件

广东工业大学计算机学院46

工具栏的创建工具栏的创建

创建工具栏时,直接将组件添加到工具栏中,再将工具栏放入框架中: JToolBar bar = new JToolBar(); bar.add(blueButton); frame.add(bar, BorderLayout.NORTH);

也可以使用添加 Action 对象的方法来填充工具栏: bar.add(blueAction);

可以设置工具提示: setToolTipText(String) ;

如果使用 Action 对象,则可使用 putValue 方法 putValue(Action.SHORT_DESCRIPTION, “…”)

注意:按钮是工具栏中最常见的组件类型。但其它组件也可以放置在工具栏中,例如复选框等。

Page 47: 第七章 Swing 用户界面组件

广东工业大学计算机学院47

工具栏相关的常用方法工具栏相关的常用方法

Java.swing. JToolBar

JToolBar( ) JToolBar(String titleString) JToolBar(int orientation) //orientation: SwingConstants. HORIZONTAL 或

SwingConstants.VERTICAL

JButton add(Action a) 在工具栏添加与动作 a关联的按钮

void addSeparator( ) 在工具栏末尾添加一个分隔符

Java.swing. JToolBar

void setToolTipText(String text) 设置当鼠标停留在组件上时显示的工具提示的文本

Page 48: 第七章 Swing 用户界面组件

广东工业大学计算机学院48

本章内容本章内容

7.1 布局管理器概述

7.2 常用组件介绍 文本输入 选择组件和单选按钮 菜单 工具栏

7.3 对话框 对话框简介 选项对话框 文件对话框 颜色对话框

Page 49: 第七章 Swing 用户界面组件

广东工业大学计算机学院49

对话框的种类对话框的种类

对话框分为模式对话框和无模式对话框。

1.模式对话框 在用户结束对它的操作之前,不允许用户与应

用程序其它窗口的交互。

模式对话框的作用:在程序继续运行之前,必须获得用户提供的信息。

例如: 用户希望读取某个文件,则可以使用模式对话框请求用户提供文件名以及路径。

Page 50: 第七章 Swing 用户界面组件

广东工业大学计算机学院50

无模式对话框无模式对话框

无模式对话框运行用户同时在对话框和应用程序的其它窗口中输入信息。

例如:工具栏。

工具栏可以停靠在任何地方,并且用户可以在需要时与应用程序窗口和工具栏进行交互。

下面将会介绍一些常用的对话框: 选项对话框、文件对话框、颜色对话框

Page 51: 第七章 Swing 用户界面组件

广东工业大学计算机学院51

本章内容本章内容

7.1 布局管理器概述

7.2 常用组件介绍 文本输入 选择组件和单选按钮 菜单 工具栏

7.3 对话框 对话框简介 选项对话框 文件对话框 颜色对话框

Page 52: 第七章 Swing 用户界面组件

广东工业大学计算机学院52

1). 1). 选项对话框选项对话框

Swing提供了一组简单的对话框,用于收集用户提供的简单信息。 JOptionPane 有四个用于显示这些简单对话框的静态方法:

showMessageDialog :显示一条消息,并等待用户点击 OK

showConfirmDialog :显示一条消息,并等待用户点击确认 ( 与 OK/Cancel 按钮类似 )

showOptionDialog :显示一条消息,并等待用户作出某一种选择

showInputDialog :显示一条消息,并等待用户输入一行信息

Page 53: 第七章 Swing 用户界面组件

广东工业大学计算机学院53

选项对话框选项对话框

假设需要显示一个如图所示的对话框,要求用户确认或者取消,它是一个确认对话框: int selection = JOptionPane.showConfirmDialog(parent,

“Message”, “Title”, // 设置要显示的字符串和标题 JOptionPane.OK_CANCEL_OPTION, // 设置 OK 和 Cancel 按钮 JOptionPane.QUESTION_MESSAGE); // 设置图标为问题图标

//selection 的值指示了用户单击了哪一个按钮 if (selection == JOptionPane.OK_OPTION) . . .

具体的参数选择可以参照 JAVA API: DEFAULT_OPTION YES_NO_OPTION YES_NO_CANCEL_OPTION OK_CANCEL_OPTION

图标设置参数:

ERROR_MESSAGE

INFORMATION_MESSAGE

WARNING_MESSAGE

QUESTION_MESSAGE

PLAIN_MESSAGE

Page 54: 第七章 Swing 用户界面组件

广东工业大学计算机学院54

示例示例

不同类型模式对话框示例 OptionDialogTest.java

Page 55: 第七章 Swing 用户界面组件

广东工业大学计算机学院55

创建对话框创建对话框

如何创建一个对话框?可遵循以下几个步骤: 1. 创建一个派生自 JDialog 类的子类。

2. 在子类的构造器中,需要进行以下工作:(1) 调用超类的构造器,用于指定对话框的拥有者

(owner frame) ,(也可以设置为 null ,但这样对话框有可能被隐藏在其它窗口后面),对话框的标题以及是否模式对话框

(2) 添加对话框的用户界面组件(3) 添加相应的事件处理器(5) 设置对话框的大小

Page 56: 第七章 Swing 用户界面组件

广东工业大学计算机学院56

举例:创建一个举例:创建一个 AboutAbout 对话框对话框

public AboutDialog extends JDialog { public AboutDialog(JFrame owner) { //调用超类构造器 super(owner, “About DialogTest”, true); // 添加组件和事件监听器, true参数表示该对话框为模式

对话框 add(new JLabel(“…"), BorderLayout.CENTER); JPanel panel = new JPanel(); JButton ok = new JButton("Ok");

ok.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent event) { setVisible(false); } });

panel.add(ok); add(panel, BorderLayout.SOUTH); setSize(250, 150); // 设置对话框大小 } } 演示 DialogTest.java

Page 57: 第七章 Swing 用户界面组件

广东工业大学计算机学院57

练习:自定义数据交换对话框练习:自定义数据交换对话框

使用对话框的一个重要目的是获取用户的输入信息。

举例:定义一个包含菜单栏的框架,菜单栏中包含一个菜单项File-connect, 点击 connect 菜单项将弹出一个要求输入用户名和用户密码的对话框,该对话框有 OK 和 Cancel两个按钮,如果用户点击 OK 按钮,则关闭对话框并将用户名和密码记入一个文本域组件中。

实验题

Page 58: 第七章 Swing 用户界面组件

广东工业大学计算机学院58

本章内容本章内容

7.1 MVC模式

7.2 布局管理器概述

7.3 常用组件介绍 文本输入 选择组件和单选按钮 菜单 工具栏

7.4 对话框 对话框简介 选项对话框 文件对话框 颜色对话框

Page 59: 第七章 Swing 用户界面组件

广东工业大学计算机学院59

2. 2. 文件对话框文件对话框

文件对话框用于帮助用户打开或者保存文件。下面是建立文件对话框并且获取用户选择信息的步骤:

1. 建立一个 JFileChooser 对象。与 JDialog 类构造器不同,这种对象不需要指定父组件,因而允许在多个框架中重用一个文件选择器: JFileChooser chooser = new JFileChooser();

2. 调用 setCurrentDirectory 方法设置当前目录 chooser.setCurrentDirectory(new File("."));

3. 如果要指定一个默认的文件名,可以使用setSelectedFile 方法: chooser.setSelectedFile(new File(filename));

Page 60: 第七章 Swing 用户界面组件

广东工业大学计算机学院60

文件对话框(续)文件对话框(续)

4. 如果要允许用户能同时选中多个文件,可以使用setMultiSelectionEnabled 方法: chooser.setMultiSelectionEnabled(true);

5. 如果希望在对话框中只显示某一类型的文件 ( 如所有 .gif文件 ) ,则需要文件过滤器。 ( 后面讨论 )

6. 默认情况下只能选中文件,如果希望允许用户选择目录,则需要使用 setFileSelectionMode 方法,相关参数值为: JFileChooser.FILES_ONLY /

JFileChooser.DIRECTORIES_ONLY / JFileChooser.FILES_AND_DIRECTORIES

例如:chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);

Page 61: 第七章 Swing 用户界面组件

广东工业大学计算机学院61

文件对话框(续文件对话框(续 22))

7. 调用 showOpenDialog 或者 showSaveDialog 方法显示对话框。必须为这些调用指定父组件: int result = chooser.showOpenDialog(parent);

int result = chooser.showSaveDialog(parent); //result 的值可以为: JFileChooser.APPROVE_OPTION 或 JFileChooser.CANCEL_OPTION 或 JFileChooser.ERROR_OPTION

8. 使用 getSelectedFile 或者 getSelectedFiles 来获得选中的一个或多个文件。这些方法返回一个 File 对象或者一组 File 对象。如果需要文件对象名字时,可以调用 getPath 方法: String filename = chooser.getSelectedFile().getPath();

Page 62: 第七章 Swing 用户界面组件

广东工业大学计算机学院62

文件过滤器 文件过滤器 (1)(1)

文件过滤机制:如果要限制只显示某种文件,则需要创建一个扩展自 javax.swing.filechooser.FileFilter抽象类的对象。把每个文件传递给文件过滤器,只有文件过滤器接受的文件才被最终显示。

FileFilter抽象类中有两个抽象方法必须在子类中实现: public boolean accept(File f); //测试是否接收一个文件 public String getDescription(); //返回显示在文件对话框中文件类型

的说明信息

例如创建一个只显示 .gif 文件的过滤器:public class GifFilter extends FileFilter { public boolean accept(File f) { return f.getName().toLowerCase().endsWith(".gif") || f.isDirectory(); // 若 f 的后缀为 .gif 或者 f 是一个目录,则可以显示 } public String getDescription() { return "GIF Image"; } }

Page 63: 第七章 Swing 用户界面组件

广东工业大学计算机学院63

文件过滤器 文件过滤器 (2)(2)

创建了文件过滤器后,就可以利用 JFileChooser 类的setFileFilter 方法,将这个对象安装到文件选择器对象中

chooser.setFileFilter(new GIFFilter() );

示例程序:打开硬盘上的一个后缀为 jpg, jpeg, gif 的图象文件

演示 FileChooserTest.java

Page 64: 第七章 Swing 用户界面组件

广东工业大学计算机学院64

3. 3. 颜色选择器颜色选择器

颜色选择器 JColorChooser :是用于挑选某种颜色的组件。

1. 用颜色选择器显示模式颜色选择对话框 Color selectedColor = new JColorChooser . showDialog(parent, title,

initialColor);

2. 用颜色选择器显示无模式颜色选择对话框 chooser=new JColorChooser(); JDialog dialog =JColorChooser.createDialog ( parent, “Title”, false // not modal , chooser, new ActionListener(){…} //OK button listener, null // no cancel button listener )

Page 65: 第七章 Swing 用户界面组件

广东工业大学计算机学院65

颜色选择器示例颜色选择器示例

在窗口中放置三个按钮 modal, modaless 和immediately ,如果点击modal ,就出现模式颜色选择框,点击modaless 或 immediately ,则出现无模式颜色选择框,若若在出现的颜色选择框中选定一种颜色并点击确定,则将窗口的背景颜色改为所选的颜色。

演示 ColorChooserTest.java