650 likes | 818 Views
第七章 Swing 用户界面组件. 广东工业大学计算机学院. 本章内容. 7.1 布局管理器概述 7.2 常用组件介绍 文本输入 选择组件和单选按钮 菜单 工具栏. 7.3 对话框 对话框简介 选项对话框 文件对话框 颜色对话框. 什么是布局管理器. 当往窗口中放置组件时,首先要指定组件的放置策略。 布局管理器: 解决如何将组件安排在一个框架或面板内的问题。 三种最简单的 布局管理器 : 流布局管理器 ( flow layout manager) 边界布局管理器 ( border layout manager)
E N D
第七章Swing用户界面组件 广东工业大学计算机学院
本章内容 • 7.1 布局管理器概述 • 7.2 常用组件介绍 • 文本输入 • 选择组件和单选按钮 • 菜单 • 工具栏 • 7.3 对话框 • 对话框简介 • 选项对话框 • 文件对话框 • 颜色对话框 广东工业大学计算机学院
什么是布局管理器 • 当往窗口中放置组件时,首先要指定组件的放置策略。 • 布局管理器:解决如何将组件安排在一个框架或面板内的问题。 • 三种最简单的布局管理器: • 流布局管理器(flow layoutmanager) • 边界布局管理器(border layoutmanager) • 网格布局管理器(grid layout manger) 广东工业大学计算机学院
1. 流布局管理器 • 流布局管理器(flow layoutmanager) 将组件按加入的先后次序从左至右排列在面板中。 • 在Java API库中,流布局管理器对应的类是FlowLayout,它有3个构造器: • FlowLayout():居中对齐,水平间距和垂直间距都是5个像素。 • FlowLayout(int align):指定对齐方式align,水平间距和垂直间距都是5个像素。 • FlowLayout(int align, int hGap, int vGap):指定对齐方式align、水平间距和垂直像素。 • 对于对齐方式,可以用FlowLayout类中的以下属性指定: LEFT / CENTER / RIGHT:左对齐/居中对齐/右对齐 广东工业大学计算机学院
流布局管理器的使用效果 • JPanel容器类默认使用的布局管理器是流布局管理器。 • 按钮居中显示在一行中,当一行空间不够时,就显示在新的一行上。如图所示: • 用户对框架进行拖动缩放,这些按钮也会显示在面板的中央。 演示FlowLayoutTest.java 广东工业大学计算机学院
2. 边界布局管理器 • 边界布局管理器(border layoutmanager)把一个容器(例如panel)分成North、West、Center、East、South五部分,对应的类是BorderLayout。 • 例:使用边界布局管理器,将一个Button放在South位置。 • panel.setLayout(new BorderLayout()); • panel.add(aButton, BorderLayout.SOUTH); • BorderLayout是Window、Frame和Dialog缺省的布局管理器。 广东工业大学计算机学院
效果举例 • 仅使用BorderLayout来定位组件往往不能准确定位组件。下图显示了上一个页面中代码的执行结果: • 按钮自动扩展到填满框架的整个South区域;而且如果再往South区域添加一个新按钮时,旧按钮就会被替换掉。 • panel.setLayout(new BorderLayout()); • panel.add(aButton, BorderLayout.SOUTH); 广东工业大学计算机学院
面板嵌套 • 可以通过面板嵌套来解决这个问题: 1. 创建一个新panel,命名为southPanel。 2. 在southPanel中设置按钮的布局方式,向southPanel中添加按钮。 3. 添加southPanel至South区域。 演示BorderLayoutTest.java • JPanel southPanel = new southPanel(); • southPanel.add(yBt); • southPanel.add(bBt); • southPanel.add(rBt); • panel.setLayout(new BorderLayout()); • panel.add(southPanel, BorderLayout.SOUTH); 广东工业大学计算机学院
网格布局管理器 • 网格布局管理器(grid layout manger):这种布局是将容器分成单元格,每个单元格的大小都一样。例如: • panel.setLayout(new GridLayout(2, 3)); • 将面板分成2行和3列,然后将组件添加到单元格中: • panel.add(new JButton(“1”)); • panel.add(new JButton(“2”)); • 组件的添加顺序是从第一行第一列开始,接着是第一行第二列…… • 网格布局布局管理器总是忽略组件的最佳大小。所有单元的宽度和高度是相同的,是根据单元数对可用宽度和高度进行平分而定。 广东工业大学计算机学院
一个用于显示计算结果的按钮,使用BorderLayout放置于North一个用于显示计算结果的按钮,使用BorderLayout放置于North 一个子面板,置于根面板的CENTER,该子面板内使用GridLayout布局。 举例:计算器程序 • 制作一个如图所示的计算器程序。 • 使用面板嵌套技术: 广东工业大学计算机学院
布局管理器小结 • 布局管理器主要应用于容器类中。其一般使用步骤如下: • 1. 获得容器类对象。 • 例如:JPanel parentPanel = new JPanel(); • 2. 对该容器类对象设置布局管理器。 • 例如:panel.setLayout(new GridLayout(2, 3)); • 3. 根据布局管理器的特性,将组件放置于适当的位置。 • 例如:panel.add(new JButton(“1”)); • 4. 如果需要获得更加精确的布局,可以使用容器类的嵌套。 广东工业大学计算机学院
复杂的布局管理器 • 除了这些简单的布局管理器,Java还提供了一系列功能更加强大,使用起来也更加复杂的管理器: • 1. 箱式布局管理器(BoxLayout) • 2. 网格组布局管理器(GridbagLayout) • 3. 弹簧布局管理器(SpringLayout) • 另外,用户还可以自定义布局管理器。 • 详细介绍参考《java2核心技术卷I》P393 广东工业大学计算机学院
1. 箱式布局管理器 • 箱式布局管理器(BoxLayout):用于布局单行或者单列组件。 • 布局策略:将组件按行或者列排列。如果组件的最小宽度之和大于箱的宽度,则不显示某些组件。组件之间的间隔要手动添加。 广东工业大学计算机学院
2.网格组布局管理器 • 网格组布局管理器(GridbagLayout):“没有限制的网格布局”。 • 特点:可以改变行和列的的尺寸;大的组件可以占用多行或多列。 广东工业大学计算机学院
3. 弹簧布局管理器 • 弹簧布局管理器(SpringLayout):提供一种在一定范围内,灵活设定组件间距的布局策略。 • 弹簧具有:最小值、首选值、最大值、实际值。 • 当容器大小发生改变时,组件间距也会在弹簧的最大值和最小值之间发生改变。 广东工业大学计算机学院
本章内容 • 7.1 MVC模式 • 7.2 布局管理器概述 • 7.3 常用组件介绍 • 文本输入 • 选择组件和单选按钮 • 菜单 • 工具栏 • 7.4 对话框 • 对话框简介 • 选项对话框 • 文件对话框 • 颜色对话框 广东工业大学计算机学院
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列(并非可以输入的字符的个数)。 广东工业大学计算机学院
文本域JTextField的常用函数 • Java.swing. JTextField JTextField(int cols) 构造一个指定列数的空JTextField JTextField(String text,int cols) 构造一个指定列数,指定初始字符串的JTextField void setColumns(int cols) 设置文本域使用的列数 广东工业大学计算机学院
文本区(JTextArea) • 文本区JTextArea组件可以让用户输入多行文本。在JTextArea组件中,可以指定文本区的行数和列数: • textArea = new JTextArea(8, 40); // 8行40列 • 一行的结尾为’\n’(回车)符 • 如果文本区的文本超出显示范围,则其余的文本会被剪裁。 • 可以使用换行来避免行过长: • textArea.setLineWrap(true); • 在Swing中,文本区没有滚动条,需要手动安装: • JScrollPane scrollPane = new JScrollPane(textArea) 演示TextAreaTest.java 广东工业大学计算机学院
文本域JTextArea的常用函数 • 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上添加滚动条,返回添加后的组件 广东工业大学计算机学院
文本域与文本区的常用方法 • Java.swing.text.JTextComponent void setText(String t) 用新文本改变文本组件中的文本 String getText() 返回文本组件中的文本 void setEditable(boolean b) 确定用户是否可以编辑JTextComponent中的内容 • Java.swing. JComponent void revalidate( ) 重新计算容器内所有组件的大小和位置,并对它们重新布局 如 panel.revalidate() 广东工业大学计算机学院
标签组件(JLabel) • 标签是容纳文本的组件。它们没有任何修饰(例如没有边界),也不响应用户输入。 • 标签的常用用途之一就是标识组件,例如标识文本域。其使用步骤如下: • 1. 创建一个JLabel组件 例: JLabel label = new JLabel(“hours”, SwingConstants.RIGHT); 或者 JLabel label = new JLabel(“hours”, JLabel.RIGHT); 上面的代码创建了一个label,并指定label的对齐方式为右对齐。 • 2. 将标签组件放置在离标识的组件足够近的地方。 广东工业大学计算机学院
实例:一个可以设置时间的钟 • 本程序演示了一个可以设置时间的钟。 当用户在文本域中输入相应的小时和分钟数值时,时钟就将长针和短针绘制出来。 • 本程序需要监视文本域的变化。 • 文本类组件(继承JTextComponent的组件)由文本模型(Document接口)来捕捉,获得文本模型的方法是: Document getDocument( ); //JTextComponent • 再在文本模型安装文档监听器(document listener)能够监听文本域变化事件。 广东工业大学计算机学院
实例的关键代码 • 当文本发生改变后,文档监听器(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) { } 广东工业大学计算机学院
本章内容 • 7.1 布局管理器概述 • 7.2 常用组件介绍 • 文本输入 • 选择组件和单选按钮 • 菜单 • 工具栏 • 7.3 对话框 • 对话框简介 • 选项对话框 • 文件对话框 • 颜色对话框 广东工业大学计算机学院
2. 选择组件 • 常见的选择组件有:复选框、单选按钮、选项列表以及滑块等。 1).复选框JCheckBox • 如果想要接收的输入只有“是”或“非”两者的话,可以使用复选框组件。这种组件缺省带有标识标签。 • 在构造器中可以指定该标签的文本: • bold = newJCheckBox(“Bold”); • 用户点击复选框的动作监听器为实现ActionListener接口。(actionPerformed方法) 广东工业大学计算机学院
复选框实例:监听器使用 • 实例:使用选中的字型显示字符串。 …… • 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 广东工业大学计算机学院
复选框JCheckBox的常用函数 • Java.swing. JCheckBox JCheckBox(String label) 用给定的标签构造一个复选框 JCheckBox(String label, boolea state) 用给定的标签和初始化状态构造一个复选框 boolean isSelected( ) 返回复选框状态 void setSelected(boolean state) 为复选框设置状态 广东工业大学计算机学院
2). 单选按钮 • 单选按钮(radio button group):提供一组选择项,用户在任何时刻只能选择一个选择项,每个选项都带有一个标签。 • 在Swing中实现单选按钮对象的步骤: • 1. 创建一个ButtonGroup对象 • ButtonGroupgroup = 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); 广东工业大学计算机学院
单选按钮实例:监听器使用策略 • 用户点击单选按钮的动作监听器为实现ActionListener接口(actionPerformed方法)的类对象。 • 方法一:如果各个单选按钮中的按钮的行为相似,可以让它们共享一个监听器。(需要在动作监听器中判断哪一个按钮被选中,然后才能作出响应) • 方法二:单选按钮的每个按钮对象设置其独有的监听器。(推荐) 广东工业大学计算机学院
单选按钮实例:监听器使用 • 实例:当选中不同的按钮时,使用不同的字体显示字符串。 演示RadioButtonTest.java 广东工业大学计算机学院
请自学 • 边界(Border) • 组合框(JComboBox) • 滑块(JSlider) • 微调控制器(JSpinner) 广东工业大学计算机学院
本章内容 • 7.1 布局管理器概述 • 7.2 常用组件介绍 • 文本输入 • 选择组件和单选按钮 • 菜单 • 工具栏 • 7.3 对话框 • 对话框简介 • 选项对话框 • 文件对话框 • 颜色对话框 广东工业大学计算机学院
菜单栏 子菜单项 菜单 菜单项 4. 菜单 • 菜单的创建可以遵循以下步骤: • 1. 创建一个菜单栏 • JMenuBar menuBar = new JMenuBar(); • 2. 将菜单栏放置在frame的顶部。 • frame.setMenuBar(menuBar); • 3. 为每个菜单建立一个菜单对象 • JMenu editMenu = new JMenu(“Edit”); • 4. 将顶层菜单添加到菜单栏中 • menuBar.add(editMenu); 广东工业大学计算机学院
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) ; 广东工业大学计算机学院
菜单中的图标 • 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成为图标。 广东工业大学计算机学院
弹出菜单 • 弹出菜单(pop-up menu):即单击鼠标右键可弹出的快捷菜单。 • 建立弹出菜单的方法与一般菜单相似: (1) 创建一个弹出式菜单 JPopupMenu popup = new JPopupMenu(); (2) 在菜单中添加菜单项: • JMenuItem item = new JMenuItem("Cut"); • item.addActionListener(listener); • popup.add(item); 广东工业大学计算机学院
弹出式触发器 • 弹出式触发器(pop-up trigger):用户点击鼠标某个键时,弹出菜单。 • 在Windows或者Linux中,弹出式触发器是右键。 • 要想在用户点击某一个组件的时候弹出菜单,就要使用弹出式触发器: • component.setComponentPopupMenu(popup); 广东工业大学计算机学院
快捷键 • 可以为菜单项设置快捷键。在当前菜单打开的情况下,可以按下某菜单项的快捷键,相当于鼠标单击了该菜单项。 JMenuItem CutItem=new JMenuItem(“Index”); CutItem.setMnemonic(“I”); • 快捷键就会自动显示在菜单项中,快捷键下面有一条下划线。 广东工业大学计算机学院
加速器 • 加速器可以在不打开菜单的情况下选中菜单项的快捷键。 例如,很多程序把CTRL + O和CTRL + S关联到菜单中的Open和Save项。 • 使用SetAccelerator方法可以将加速器关联到一个菜单项。该方法使用KeyStroke类型的对象作为参数。例如: • openItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O, InputEvent.CTRL_MASK)); • 当用户按下加速器组合键时,就自动选择了相应的菜单项,同时激活一个动作事件。 • 注意:加速器实际上并不打开菜单,而是直接激活菜单关联的动作事件。 广东工业大学计算机学院
启用和禁用菜单项 • 在程序运行过程中,经常需要屏蔽某些暂时不适用的命令,待到条件允许时再使之重新可用。 • 屏蔽/启用菜单项的方法: • aMenuItem.setEnabled(boolean) • 当参数值为false时,屏蔽该菜单项; • 当参数值为true时,启用该菜单项; • 如果需要动态启用/屏蔽某菜单项,则需要为“menu selected”事件注册监听器。javax.swing.event包定义了MenuListener接口,它有三个方法: • void menuSelected(MenuEvent event) • void menuDeselected(MenuEvent event) • void menuCanceled(MenuEvent event) 广东工业大学计算机学院
监听“menu selected”事件 • 只需要监听“menu selected”事件,当一个菜单被选中时,将菜单中包含的需要被屏蔽的菜单项屏蔽掉即可。 • 例如下列代码可屏蔽/打开Save按钮和Save As按钮。 • public void menuSelected(MenuEvent event) { • saveAction.setEnabled(!readonlyItem.isSelected()); • saveAsAction.setEnabled(!readonlyItem.isSelected()); • } • 注意:此处不使用仅用Save和Save As菜单项是因为对于拥有加速键的菜单项,即使菜单项被屏蔽,也可以使用加速键直接激发菜单项关联的动作事件。 广东工业大学计算机学院
练习:创建一组菜单 演示MenuTest 广东工业大学计算机学院
本章内容 • 7.1 布局管理器概述 • 7.2 常用组件介绍 • 文本输入 • 选择组件和单选按钮 • 菜单 • 工具栏 • 7.3 对话框 • 对话框简介 • 选项对话框 • 文件对话框 • 颜色对话框 广东工业大学计算机学院
5. 工具栏 • 工具栏是在程序中提供快速访问常用命令的按钮栏。 • 工具栏的特别之处在于可以移动,脱离工具栏或拖拽到框架其他地方,如图所示。 广东工业大学计算机学院
工具栏的创建 • 创建工具栏时,直接将组件添加到工具栏中,再将工具栏放入框架中: • JToolBar bar = new JToolBar(); • bar.add(blueButton); • frame.add(bar, BorderLayout.NORTH); • 也可以使用添加Action对象的方法来填充工具栏: • bar.add(blueAction); • 可以设置工具提示: • setToolTipText(String); • 如果使用Action对象,则可使用putValue方法 • putValue(Action.SHORT_DESCRIPTION, “…”) • 注意:按钮是工具栏中最常见的组件类型。但其它组件也可以放置在工具栏中,例如复选框等。 广东工业大学计算机学院
工具栏相关的常用方法 • 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) 设置当鼠标停留在组件上时显示的工具提示的文本 广东工业大学计算机学院
本章内容 • 7.1 布局管理器概述 • 7.2 常用组件介绍 • 文本输入 • 选择组件和单选按钮 • 菜单 • 工具栏 • 7.3 对话框 • 对话框简介 • 选项对话框 • 文件对话框 • 颜色对话框 广东工业大学计算机学院
对话框的种类 • 对话框分为模式对话框和无模式对话框。 • 1.模式对话框 • 在用户结束对它的操作之前,不允许用户与应用程序其它窗口的交互。 • 模式对话框的作用:在程序继续运行之前,必须获得用户提供的信息。 • 例如: • 用户希望读取某个文件,则可以使用模式对话框请求用户提供文件名以及路径。 广东工业大学计算机学院
无模式对话框 • 无模式对话框运行用户同时在对话框和应用程序的其它窗口中输入信息。 • 例如:工具栏。 • 工具栏可以停靠在任何地方,并且用户可以在需要时与应用程序窗口和工具栏进行交互。 • 下面将会介绍一些常用的对话框: • 选项对话框、文件对话框、颜色对话框 广东工业大学计算机学院