1、第第8章章 图形用户界面设计图形用户界面设计图形用户界面图形用户界面图形用户界面(Graphical User Interface,简称GUI)是人机交互接口,它是应用程序的外观。Java语言提供了一套用来构建用户界面的组件(component),包括面板(Panel)、按钮(Button)、标签(Label)、画板(Canvases)、滚动条(Scrollbar)、列表框(List)、文本域(TextField)、文本区(TextArea)等。AWT与与Swing 早期的JDK版本中提供的是Java抽象窗口工具集(Abstract Window Toolkit,简称AWT),相应的组件定义在
2、java.awt包中。在后续的JDK版本中,又提供了功能更强的Swing。Swing属于JavaTM Foundation Classes(简称JFC)的一部分。Swing组件则定义在javax.swing包中。AWT包包 AWT中包含的主要类及相互的继承关系如图:Swing包包Swing包中主要的类与继承关系如图所示AWT包与包与Swing包包 Swing对AWT的改进主要的是体现在平台无关性上。Swing称为轻量级(lightweight)组件,在实现时可以完全不依赖于本机环境。所以使用Swing组件的程序移植性更好。AWT组件称为重量级(heavyweight)组件,是指它含有较多的本机
3、代码,平台无关性不彻底,不便于程序移植。组件和容器组件和容器组件是构成图形用户界面最基本的元素。组件的级别是不同的,有些组件是最顶层的组件,可以在界面窗口内直接显示。有一些组件不能单独存在,它们必须被加入到某个组件中才能显示。能够容纳其他组件的组件称为容器(container),有了容器,就可以构造嵌套关系的组件架构,从而形成复杂的窗口界面。设计程序时,最外层的组件必须是容器,这些容器称为顶层容器。Swing中共有四种顶层容器,分别为JFrame、JApplet、JDialog和JWindow。窗口简单示例窗口简单示例程序8-1 窗口简单示例 import java.awt.*;import
4、javax.swing.*;public class JFrameDemo1 public static void main(String args)JFrame frame=new JFrame(JFrame);/创建一个JFrame的实例 JButton button=new JButton(A Frame);/创建一个JButton的实例 /将JButton放到JFrame的中央 frame.getContentPane().add(button);frame.pack();/将JFrame设置到适当的大小 frame.setVisible(true);/显示JFrame 窗口简单示例窗
5、口简单示例该程序运行之后,弹出的窗口如图8-3所示,窗口中有一个按钮。内容窗格内容窗格 Swing的顶层容器是不能直接添加组件的。每个顶层容器都有一个内容窗格(Content Pane),也称为内容面板。除菜单之外的组件都需要放在这个内容窗格中,通过getContentPane()方法得到一个内容窗格。既可以直接调用顶层容器的add()方法,也可以调用内容窗格的add()方法来添加组件。每种顶层容器都有默认的内容窗格,也可以创建一个新的内容窗格取代顶层容器默认的内容窗格。内容窗格内容窗格当创建一个新的内容窗格时,通常的做法是创建面板JPanel的一个实例(JPanel是java.awt.Con
6、tainer的子类),然后将组件添加到JPanel实例中,再通过顶层容器的setContentPane()方法将JPanel实例设置为新的内容窗格。修改程序8-1,创建新的内容窗格并添加组件。(见下一页)内容窗格的完整程序内容窗格的完整程序程序8-2创建新的内容窗格的完整程序 import java.awt.*;import javax.swing.*;public class JFrameDemo2 public static void main(String args)JFrame frame=new JFrame(JFrameDemo2);/创建一个JFrame的实例 JButton b
7、utton=new JButton(A Button);/创建一个JButton的实例 JPanel contentPane=new JPanel();/创建一个JPanel的实例 /为JPanel设置BorderLayout布局管理器 contentPane.setLayout(new BorderLayout();/将JButton放到JPanel的中央 contentPane.add(button,BorderLayout.CENTER);/为JFrame设置新的内容窗格 frame.setContentPane(contentPane);frame.pack();/将JFrame设置到
8、适当的大小 frame.setVisible(true);/显示JFrame 按钮按钮 按钮是Java图形用户界面的基本组件之一,下图中显示的是最常用到的四种按钮,分别是JButton、JToggleButton、JCheckBox、JRadioButton 按钮按钮这些按钮类均是AbstractButton的子类或间接子类,各类之间的继承关系如图所示 按钮按钮Button是最简单的按钮,它的构造方法中可以指定在按钮上要显示的内容,既可以显示文本,也可以显示图标。切换按钮(JToggleButton)具有两种状态,即选中状态和未选中状态,每次单击导致从一种状态变为另一种状态。构造方法中如果没有
9、指定按钮的初始状态,则默认地处于未选中状态。上图中第二个按钮被单击过一次,为选中状态,第一个按钮未被单击过,为未选中状态,而第三个按钮被单击过两次,又回到未选中状态。按钮按钮复选按钮(JCheckBox)允许同时选取多个选项,如图8-7中第一排的按钮所示。而单选按钮(JRadioButton)顾名思义,只允许在多种选择中选择一种,具有排他性,如图8-7中第二排的按钮所示。JCheckBox和JRadioButton都是JToggleButton的子类,构造方法的格式与JToggleButton相同,它们也都具有选中和未选中两种状态。标签(标签(JLabel)标签对象通常用于显示提示性的内容,可
10、以显示文本信息,也可以显示图标。构造方法中的int型参数horizontalAlignment用来指定显示的信息在水平方向上的对方方式,它的取值可以是JLabel.LEFT、JLabel.RIGHT和JLabel.CENTER等常量,分别表示左对齐、右对齐和居中。可以分别使用setHorizontalAlignment(int alignment)方法和setVerticalAlignment(int alignment)方法改变标签内容的水平或垂直对齐方式。改变水平对齐方式时,alignment取值可为JLabel.LEFT、JLabel.RIGHT和 JLabel.CENTER等常量,改变
11、垂直对齐方式时,alignment取值可为JLabel.TOP、JLabel.BOTTOM和JLabel.CENTER等常量。标签示例标签示例JLabel label=new JLabel(“Hello”,JLabel.RIGHT);/构造一个以右对齐方式显示的标签label.setHorizontalAlignment(JLabel.CENTER);/显示内容设置为水平居中label.setVerticalAlignment(JLabel.BOTTOM);/显示内容设置为底部对齐label.setVerticalTextPosition(JLabel.BOTTOM);/设置文本信息显示在图标
12、的底部label.setHorizontalTextPosition(JLabel.CENTER);/文本和图标都居中在程序中,可以使用setText(String text)方法修改显示在标签上的文本信息,也可以使用setIcon(Icon icon)方法修改标签上的图标,但是在程序运行过程中,用户不能对标签内容进行修改。组合框组合框 组合框(JComboBox)是一个下拉式菜单。程序中当一个输入框中的值只有若干种选择的时候,可以将它们组织到组合框中,使用者只需要从中选择就可以了。组合框分可编辑和不可编辑两种形式。对不可编辑的组合框,用户只能在现有的选项列表中选择其中之一;而可编辑的组合框,
13、用户既可以在现有选项中选择,也可以输入新的内容。组合框常用方法组合框常用方法 组合框中控制选项的方法:例8-4 组合框示例 String itemList=One,Two,Three,Four,Five;JComboBox jcb=new JComboBox(itemList);/创建一个具有五个可选项的组合框方法名功能addItem(Object anObject)在末尾位置添加新的可选项insertItemAt(Object anObject,int index)在index指定的位置添加新的可选项anObjectremoveItem(Object anObject)删除由anObject
14、指定的可选项文本组件文本组件 Java提供了文本组件,专门用来处理输入较多文字的情况。文本组件既能显示信息,也可以接受用户的输入。在Swing中有多个文本组件,如文本域(JTextField)、口令输入域(JPasswordField)、文本区(JTextArea)等,它们有共同的基类JTextComponent。文本域是一个单行的文本输入框,可用于输入少量文本。它的构造方法允许指定列数,也可以显示初始字符串。文本区是一个多行多列的文本输入框,同样地,它允许程序员设定初始的字符串,也允许设定初始的行数和列数。文本组件示例文本组件示例例8-5 文本组件示例/创建一个列数为30、有初始字符串的文本
15、域JTextField tf=new JTextField(“Single Line”,30);/创建一个4行30列、有初始字符串的文本区JTextArea ta=new JTextArea(“Initial text”,4,30);菜单组件菜单组件 Swing包中提供了设计菜单时使用的多种组件,包括JMenuBar、JMenuItem、JMenu、JCheckBoxMenuItem、JRadioButtonMenuItem和JPopupMenu等,它们的继承关系如图所示菜单示例菜单示例例8-6 菜单示例 /定义菜单栏 JFrame frame=new JFrame(“JMenuBar”);J
16、MenuBar menubar=new JMenuBar();/创建最上面一行的菜单 frame.setJMenuBar(menubar);/定义菜单 JMenu menu1=new JMenu(File);/最上面一行菜单的内容 JMenu menu2=new JMenu(Edit);/第二项 menubar.add(menu1);/将菜单加入菜单栏中 menubar.add(menu2);/建立并添加菜单项 JMenuItem mi1=new JMenuItem(Save);JMenuItem mi2=new JMenuItem(“Load”);JMenuItem mi3=new JMen
17、uItem(“Quit”);menu1.add(mi1);/添加菜单项 menu1.add(mi2);menu1.addSeparator();/添加分隔线 menu1.add(mi3);特殊菜单项特殊菜单项除了普通的菜单项之外,还有两种特殊的菜单项,分别是复选菜单项和单选菜单项。复选菜单项的前面有一个方框,单选菜单项的前面有一个圆圈。这两类菜单项都可以选中或不选中,使用方法与复选按钮和单选按钮类似。这两类特殊菜单项也可以显示文本和图标,同时可以在构造方法中用boolean型参数指定菜单项的初始状态。例如:JCheckBoxMenuItem mi1=new JCheckBoxMenuItem(
18、“Persistent”);/未选中 JCheckBoxMenuItem mi2=new JCheckBoxMenuItem(“transient”,true);/选中上述命令构造两个复选菜单项,一个显示“Persistent”、初态为未选中,另一个显示“transient”、初态为选中。对话框对话框 对话框有3类普通对话框标准对话框文件对话框对话框(JDialog)是一个可移动窗口,它能够被设置为“模式(modal)”窗口。所谓“模式”窗口是指在该窗口被关闭之前,其他窗口无法接收任何形式的输入。对话框可以带标题,并需要指定它的拥有者是哪个框架。例如创建一个标题为“Dialog”的模式对话框:
19、JDialog dialog=new JDialog(frame,“Dialog”,true);这个对话框的拥有者为框架frame。对话框依附于其拥有者,当拥有者被清除后,对话框也被清除。如果拥有者最小化,对话框也随之不可见。标准对话框标准对话框 Swing中还提供了用于显示标准对话框(JOptionPane)的JOptionPane类。例如下面两个是常用的标准对话框:JOptionPane.showMessageDialog(frame,File not found.,An error,JOptionPane.ERROR_MESSAGE);/信息对话框JOptionPane.showOpti
20、onDialog(frame,Click OK to continue,Warning,JOptionPane.DEFAULT_OPTION,JOptionPane.WARNING_MESSAGE,null,options,options0);/选项对话框文件对话框文件对话框 文件对话框(JFileChooser)是专门用于对文件(或目录)进行浏览和选择的对话框,刚刚创建的文件对话框是不可见的,根据不同的文件对话框类型可以调用不同的方法将其显示出来。例如showOpenDialog()方法将显示一个“打开”文件对话框。布局管理器布局管理器 负责组件布局的机制是布局管理器,它用来决定窗口中各组件
21、的排列方式,从而决定着界面的美观程度与使用的方便性。Java为各个容器确定了默认的布局管理器,下表列出了Java标准类库提供的几个预定义的布局管理器。布局管理器描述Border Layout将组件放到五个区域(北、南、东、西和中心)中。Box Layout将组件按一行或一列来排列。Card Layout将组件放到一个区域中,每次只能看到一个组件。Flow Layout将组件从左至右排列,排不下时另起一行。Grid Layout将组件放到横、纵的格子里。GridBag Layout将组件放到单元格里,允许组件占据多个单元。FlowLayout布局管理器布局管理器 FlowLayout是简单常用的
22、一种布局管理器。它象我们在白纸上写字那样按行来放置组件,按组件添加的次序逐个地将组件排列在容器的一行中,一行放满后就另起一个新行。FlowLayout布局管理器有5种对齐方式,如下表:对齐方式常量对齐方式常量含义含义 FlowLayout.LEFT左对齐左对齐 FlowLayout.RIGHT右对齐右对齐 FlowLayout.CENTER居中对齐居中对齐 FlowLayout.LEADING头对齐头对齐 FlowLayout.TRAILING尾对齐尾对齐 BorderLayout布局管理器布局管理器 BorderLayout是顶层容器中内容窗格的默认布局管理器。每个由BorderLayout
23、管理的容器被划分成北(North)、南(South)、西(West)、东(East)、中(Center)五个区域,分别代表容器的上、下、左、右和中部,用常量BorderLayout.NORTH、BorderLayout.SOUTH、BorderLayout.WEST、BorderLayout.EAST和BorderLayout.CENTER表示,在容器的每个区域可以加入一个组件。对East、South、West和North这四个边界区域,如果其中的某个区域没有使用,那么它的大小将变为零,此时Center区域将会扩展并占据这个未用区域的位置。GridLayout布局管理器布局管理器 GridLa
24、yout是一种网格式的多行多列的布局管理器,它的形式象是一个矩阵,组件依次放入其中,每个组件占据一格。GridLayout的构造方法中可以指定组件排列的行数和列数,也可以指定它们之间的间距。指定的行数或是列数可以为零,表明组件占用的行数或列数不受限制,依组件的具体个数来定。但不能指定行数和列数都为零。CardLayout布局管理器布局管理器 CardLayout是一种卡片式的布局管理器,它将容器中的组件处理为一系列卡片,卡片是一张张地添加到容器中的,每一时刻只显示出卡片中的一张。首次运行时显示的是第一个添加进去的卡片。程序员可以按卡片的内部次序一张张地显示卡片,也可以显示指定的卡片。在java
25、x.swing包中定义了JTabbedPane类,它的使用效果与CardLayout类似,但更为简单。BoxLayout布局管理器布局管理器 BoxLayout是定义在javax.swing包中的布局管理器,它将组件按垂直或水平方式排列在一列或一行中。使用这种布局管理器时,可以指定组件排列的次序,如从左到右横向排列,或是从上到下纵向排列。对组件的宽度和高度也做了规定。横向排列时,各组件的宽度按各自的首选值来定,而取各组件中最高的高度为高度值。纵向排列时,取各组件的首选高度为各自的高度值,以最宽的宽度值为各组件的宽度值。控制组件外观控制组件外观 边界 每个Swing组件都可以带有边界。边界本身不
26、是组件,它只是定义如何来画一个组件的边。下表列出了Java标准类库中预定义的所有边界。控制组件外观控制组件外观颜色组件可以有前景色和背景色,在JComponent类中定义了设置组件的前景色和背景色的两个方法,分别是:public void setForeground(Color c)设置前景色public void setBackground(Color c)设置背景色在这两个方法中都需要java.awt.Color类的一个实例作参数,程序员可以使用Color类中预定义的颜色常量。控制组件外观控制组件外观字体 在Java中并没有预定义的字体常量,因此需要通过给定字体名称、风格和大小自己创建Fo
27、nt对象,例如:Font f=new Font(“Dialog”,Font.PLAIN,14);Font构造方法的第一个参数是字体名称,第二个参数是字体的风格,第三个参数是字体的大小。提示工具提示工具 任何一个Swing组件都可以指定一个提示工具,它是一短行文本,当光标停在某个组件上时可以立刻显示它。提示工具常用来告诉用户这个组件的相关信息。使用组件的setToolTipText方法可以设置提示工具。例如:JButton button=new JButton(“Compute”);button.setToolTipText(“Calculates the area under the curv
28、e.”);当将按钮添加到容器中并显示时,这个提示工具就可以起作用了。当用户的鼠标指针越过按钮、停留在上面时,将弹出提示工具。当用户从按钮上移开鼠标时,提示工具也会消失。助记符助记符助记符是一个字符,它允许用户除使用鼠标之外,还可以用键盘来按按钮或从菜单中进行选择。例如,当为一个按钮定义了助记符后,用户可以按住Alt键并按下助记符来激活那个按钮。用助记符激活按钮的结果,与用户用鼠标点击按钮的效果是一样的。设置助记符的示例如下:JButton button=new JButton(“Calculate”);button.setMnemonic(C);当显示按钮时,按钮标签Calculate中的字符
29、C会加下划线。当用户按Alt-C时,激活按钮,好象用户用鼠标点击它一样。事件简述事件简述 用户在程序界面内通过键盘或是鼠标进行的操作称为用户事件(Event),这是引发程序做出反馈的源头。当某类事件发生时,会生成一个该事件类对象。例如,用户用鼠标点击按钮,事件处理系统便会生成一个代表此事件的ActionEvent事件类对象。用户的操作不同,事件类对象也会不同。监听程序监听程序为了接收并处理某类用户事件,组件必须注册相应的事件处理程序,这种事件处理程序称为事件的监听程序(Listener),它是实现了对应监听程序接口的一个类。例如,为了处理按钮上的ActionEvent事件,需要定义一个实现Ac
30、tionListener接口的监听程序类。每个组件都有若干个形如addXXXListener(XXXListener)的方法,通过这类方法,可以为组件注册事件监听程序。例如在JButton类中有如下方法:public void addActionListener(ActionListener l)该方法可为JButton组件注册ActionEvent事件监听程序,方法的参数应该是一个实现了ActionListener接口的类的实例。对按钮添加事件处理对按钮添加事件处理 JToggleButton、JCheckBox和JRadioButton等具有两种状态的按钮可以注册两类事件监听程序,分别是A
31、ctionEvent和ItemEvent事件监听程序。当窗口中有多个按钮时,需要为每个按钮都注册事件监听程序。如何区分是哪个按钮引发的事件呢?有两个方法,一是使用事件类中提供的getSource()方法,获取事件源。二是使用ItemEvent类中提供的getItem()方法,它的作用与getSource()方法相同。使用getSource()方法时需要根据按钮的实际类型进行类型转换,如下所示:JRadioButton rb=(JRadioButton)e.getSource();在事件处理程序中,通过isSelected()方法可以获取按钮的当前状态,例如:ta.append(n JCheck
32、Box Button 1+cb1.isSelected();对组合框添加事件处理对组合框添加事件处理 为组合框添加事件监听程序后,可以实现对组合框中内容的控制功能。可用于组合框的方法。例如下面的命令可以将选中的选项插入到组合框jcb2中的第一个位置:jcb2.insertItemAt(jcb1.getSelectedItem(),0);其中getSelectedItem()方法可获得用户的当前选项,在插入选项时,选项的序号是从0开始的。组合框上的用户事件既可以通过ActionListener处理,也可以通过ItemListener处理,但是用户的一次选择操作,会引发两个ItemEvent事件,
33、因此通常是使用ActionListener处理。对文本域和文本区添加对文本域和文本区添加事件处理事件处理 在文本域中只允许输入一行文本内容,当用户按“Enter”或“Return”键时,即表示输入结束,此时引发ActionEvent事件,可为文本域注册ActionListener对事件进行处理。除此之外,也可根据需要为文本域注册其他事件监听程序。由于文本区中可输入的文本是多行的,用户按“Enter”或“Return”键的结果只是向缓冲区输入一个字符,并不能表示输入结束,因此,当需要识别用户“输入完成”时,通常要在文本区旁放置一个“Apply”或“Commit”之类的按钮。通过文本组件的getT
34、ext()方法可以获取文本域中的内容,通过JTextArea的append(String str)方法可以将相关信息添加在文本区的最后。对菜单添加事件处理对菜单添加事件处理 当菜单中的菜单项被选中时,将会引发一个ActionEvent事件,因此通常需要为菜单项注册ActionListener以便对事件作出反应。当菜单项的检验状态发生改变时,会引发ItemEvent事件,可以使用ItemListener中的itemStateChanged()对此事件进行响应。通常在建立菜单系统时,可以先创建一个菜单栏并通过setMenuBar()方法将其放入某个框架;然后创建若干个菜单,通过add()方法将它们
35、加入菜单栏;最后创建各个菜单项,通过add()方法将它们加入不同菜单。事件的种类事件的种类 Java中的每种事件类都有一个对应的接口,接口中声明了一个或多个抽象的事件处理方法,凡是需要接收并处理事件类对象的类,都需要实现相应的接口。见下表:事件的种类事件的种类接上表事件适配器事件适配器 为了进行事件处理,我们需要创建实现Listener接口的类,而在某些Listener接口中,声明了很多抽象方法,为了实现这些接口。为了编程方便,Java为一些声明了多个方法的Listener接口提供了相对应的适配器(Adapter)类,见下表 事件适配器示例事件适配器示例我们在创建新类时,可以不实现接口,而是只继承某个适当的适配器,并且重载我们关心的事件处理方法。例8-7 适配器示例 import java.awt.*;import java.awt.event.*;import java.awt.event.*;public class MouseClickHandler extends MouseAdapter /我们只关心对单击鼠标事件的处理,因此在这里继承 /MouseAdapter,以避免编写其他不需要的事件处理方法 public void mouseClicked(MouseEvent e)/进行有关的处理
版权声明:以上文章中所选用的图片及文字来源于网络以及用户投稿,由于未联系到知识产权人或未发现有关知识产权的登记,如有知识产权人并不愿意我们使用,如有侵权请立即联系:2622162128@qq.com ,我们立即下架或删除。
Copyright© 2022-2024 www.wodocx.com ,All Rights Reserved |陕ICP备19002583号-1
陕公网安备 61072602000132号 违法和不良信息举报:0916-4228922