第八章:基于Swing的图形化用户界面
8.1 GUI概述
-
Java基础类,图形框架(Java Foundation Classes,JFC),由一些软件包组成,这些软件包主要包括下面一些应用程序接口
- JFC的5个API :AWT、Swing、Java2D、Drag & Drop、Accessibility
- Swing组件:是建立在AWT之上的、包括大多数轻量组件的组件集
- Java 2D应用程序接口(2D API):提供了AWT所缺乏的附加图形功能
- Drag & Drop:提供了Java和本地应用程序之间的互操作性,用来在Java应用程序和不支持Java技术的应用程序之间交换数据
- 可访问性(Accessibility)API:用以辅助开发使用非传统输入和输出的应用程序。它提供了一个辅助的技术接口,如:屏幕阅读器,屏幕放大器,听觉文本阅读器(语音处理)等等
- JFC的5个API :AWT、Swing、Java2D、Drag & Drop、Accessibility
-
组件:
- 组件是一个可以以图形化的方式显示在屏幕上并能与用户进行交互的对象
- 组件不能独立地显示出来,必须将组件放在一定的容器中才可以显示出来
- 类java.awt.Component是许多组件类的父类,因此许多组件类也就继承了Component类的成员方法和成员变量
-
容器:
- 容器是指一个特殊的屏幕区域或组件,其中可包含(更多的)组件
- 容器(Container):也是一个类,实际上是Component的子类,容器具有组件的所有性质,但是它的主要功能是容纳其它组件和容器。它是扩展Component的抽象基本类。由Container演变的类,如JPanel、JApplet、JWindow、 JDialog和JFrame等。在容器中,可以包含多个构件
- java.awt.Container:扩展Component的抽象基本类。我们可以使用容器将相关组件组合成一个整体,以简化程序GUI的设计,同时有利于组件的显示安排
-
AWT创建的组件习惯上称作重量组件,例如,当用java.awt包中AWT的Button类创建一个按钮组件时,都有一个相应的本地组件在为它工作(称为它的同位体)
- AWT组件的设计原理是把与显示组件有关的许多工作和处理组件事件的工作交给相应的本地组件
-
Swing:
- 轻量级,纯Java
- Swing提供了丰富的组件,提供了独立于运行平台的GUI构造框架,在不同的平台上都能够具有一致的显示风格,并且能够提供本地窗口系统不支持的其他特性
- Swing组件分类:
- 顶层容器组件:主要包括JFrame、JDialog、JWindow和JApplet四个组件
- 中间层容器组件:包括JPanel、JScrollPane、JSplitPane、JToolBar等
- 特殊容器:在GUI中起特殊作用的中间层容器,包括JInterFrame、JLayeredPane、JRootPane等
- 基本组件:实现人机交互的组件,包括JButton、JComboBox、JList、JMenu、JSlider、JTextField等
- 不可编辑的信息显示组件:向用户显示不可编辑信息的组件,包括JLabel、JProgressBar等
- 可编辑信息的显示组件:向用户显示能被编辑的格式化信息的组件,包括JColorChooser、JFileChooser、JTable、JTree、JTextArea等
- Swing组件层次结构:
-
-
从继承关系来看,Swing组件可以有两种类型的组件:顶层容器(JFrame、JDialog、JWindow和JApplet)和轻量级组件
-
顶层容器组件不是由JComponent继承而来,而是从AWT的容器类Frame、Dialog、Window和Applet派生而来
- 这是因为Swing程序要在本地操作系统中显示窗口图形,就必须使用本地操作系统的窗口资源,也就是说使用本地代码来绘制窗口组件,AWT的组件大多使用本地代码编写而成,因此它们继承AWT的容器类。在这四个容器组件中都有共同的JRootPane组件,它们共同构成了顶层容器组件
-
轻量级组件都是由JComponent类继承而来,而且均由纯Java代码编写而成,这样很好地实现了跨平台性,并且使程序的运行简单快捷,从而节省系统的资源
-
-
布局管理器(LayoutManager):
-
每个容器都有一个布局管理器,当容器需要对某个组件进行定位或判断其大小尺寸时,就会调用其对应的布局管理器
-
除BoxLayout外,所有的布局类都在java.awt包中,是最顶层类Java.lang.Object类的子类
-
Java中容器的默认(缺省)布局管理器:
-
Panel, JPanel FlowLayout Frame, JFrame BorderLayout -
//FlowLayout(流式布局)构造方法: FlowLayout(); //缺省的对齐方式居中对齐,横向间隔和纵向间隔都是缺省值5个象素 FlowLayout(int align); //按指定的方式对齐,横向间隔和纵向间隔都是缺省值5个象素 FlowLayout(int align,int hgap,int vgap);//第一个参数表示组件的对齐方式,指组件在这一行中的位置是居中对齐、居右对齐还是居左对齐,第二个参数是组件之间的横向间隔,第三个参数是组件之间的纵向间隔,单位是象素 align为对齐方式参数,可选值有: FlowLayout.LEFT FlowLayout.Center(默认) FlowLayout.RIGHT //当容器的大小发生变化时,用FlowLayout管理的组件会发生变化,其变化规律是:组件的大小不变,但是相对位置会发生变化 //BorderLayout(边界布局)构造方法: public BorderLayout();//各组件间横向、纵向间距为0 public BorderLayout(int hgap,int vgap); 两种添加组件的方式: f.add(button,BorderLayout.WEST); f.add(button, "North" ) ; //BorderLayout按空间简单的分为东、南、西、北、中五个区域。 North,South,East,West和Center,每个区域只能放置一个组件 //在使用BorderLayout的时候,如果容器的大小发生变化,其变化规律为组件的相对位置不变,大小发生变化 //不一定所有的区域都有组件: 1.如果四周的区域(West、East、North、South区域)没有组件,则由Center区域去补充 2.但是如果Center区域没有组件,则保持空白 //GridLayout(网格布局): 使容器中各个组件呈网格状布局,平均占据容器的空间 GridLayout类支持将组件按网格的行和列组织的布局管理程序。组件按网格从左向右排列,遵守网格的固定单元排列 setLayout(new GridLayout(3,2,10,20));//前两个参数确定网格的行数和列数,后两个参数给出行间距和列间距。若后两个参数被省略,则默认的行间距和列间距为0个像素点 注意:参数为0为任意行,行数和列数不能同时为零 //CardLayout: CardLayout布局管理器能够帮助用户处理两个以至更多的成员共享同一显示空间,它把容器分成许多层,每层的显示空间占据整个容器的大小,但是每层只允许放置一个组件
-
-
注意:
- 容器中的布局管理器负责各个组件的大小和位置,因此用户无法在这种情况下设置组件的这些属性。如果试图使用Java 语言提供的setLocation(),setSize(),setBounds() 等方法,则都会被布局管理器覆盖
- 如果确实需要亲自设置组件大小或位置,则应取消该容器的布局管理器,方法为:setLayout(null)
-
8.2 GUI设计步骤
- 先设计一个窗口,如Frame
- 确定布局管理器
- 在窗口中添加所需组件
- 改变组件颜色、字体
- 增加事件处理
8.3事件处理
-
AWT事件处理模型三个对象:
- 事件——描述所发生事件的对象
- Java中有很多不同类型的事件类,用来描述不同类型的用户动作
- 事件源 ——产生事件的组件
- 事件处理器 ——事件处理是一个方法,该方法接收一个事件对象并处理
- 事件——描述所发生事件的对象
-
监听器:
-
每个事件有一个相应的监听器接口,定义了接收和处理事件的方法。实现该接口的类,可作为监听器注册
-
每个组件都注册有一个或多个监听器(类),该监听器包含了能接收和处理事件的事件处理器(方法),一个监听器也可监听多个组件
-
包含事件处理的程序应该包括以下三部分内容: 1.在事件处理类的声明中指定要实现的监听器名,如: public class MyClass implements ActionListener { … } 2.实现监听器中的接口,如: public void actionPerformed(ActionEvent e) { ...//响应某个动作的代码... } 3.在一个或多个组件上将监听器类的实例注册为监听器,如: someComponent.addActionListener(instanceOfMyClass);
-
-
事件接口与方法目录
接口名 | 适配器类 | 方 法 |
---|---|---|
ActionListener | 无 | actionPerformed |
AdjustmentListener | 无 | adjustmentValueChanged |
ComponentListener | ComponentAdapter | componentHidden componentMoved componentResized componentShown |
ContainerListener | ContainerAdapter | componentAdded componentRemoved |
FocusListener | FocusAdapter | focusGained focusLost |
ItemListener | 无 | itemStateChanged |
KeyListener | KeyAdapter | keyPressed keyReleased keyTyped |
MouseListener | MouseAdapter | mouseClicked mouseEntered mouseExited mousePressed mouseReleased |
MouseMotionListener | MouseMotionAdapter | mouseDragged mouseMoved |
TextListener | 无 | textValueChanged |
-
事件适配器(Event Adapters)
-
Adapter类实现了相应Listener接口,但所有方法体都是空的。用户可以把自己的监听器类声明为adapter类的子类,便可以只重写需要的方法
-
public class MouseClickHandler extends MouseAdapter{ public void mouseClicked(MouseEvent e){ … } }
-
既使用Adapter类,又避免多重继承的限制
——在一个类中定义内部类,由内部类继承相应Adapter类-
public class MyClass extends JFrame { ... someObject.addMouseListener(new MyAdapter()); ... class MyAdapter extends MouseAdapter { public void mouseClicked(MouseEvent e) { ...//Event handler implementation goes here... } } } //匿名内部类进行事件处理 public class MyClass extends JFrame { ... someObject.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent e) { ...//Event handler implementation goes here... } }); ... } }
-
-
8.4 Swing组件
8.4.1 Swing容器类组件*
-
标准对话框(JOptionPane)提供了:提出问题,警告用户,提供简要的重要消息的小窗口。4个标准对话框如下:
- ConfirmDialog(确认对话框) 提出一个问题,由YES(是)、No(否)和Cancel(取消)按钮来响应
- InputDialog(输入对话框) 提示输入文本
- **MessageDialog(消息对话框)**提示用户发生了某件事情
- OptionDialog(选项对话框) 组合所有其他3个对话框
- OptionPane类中的这些对话框中的每一个都有自己的方法
-
确认对话框:
-
int showConfirmDialog(Component parentComponent,Object message,String title,int optionType, int messageType,con icon)
-
parentComponent:是指产生对话框的组件为何,通常是指Frame或Dialog组件
-
message:是指要显示的组件,通常是String或Label类型
-
title:对话框标题列上显示的文字
-
optionType:确定按钮的类型,常用的有DEFAULT_OPTION,YES_NO_OPTON,YES_NO_CANCEL,与 OK_CANCEL_OPTION.
-
messageType:指定信息类型,共有5种类型,分别是:
- ERROR_MESSAGE,INFORMATION_MESSAGE,WARING_MESSAGE, QUESTION_MESSAGE,PLAIN_MESSAGE(不显示图标).指定类型后对话框就会出现相对应的图标.
-
icon:若你不喜欢Java给的图标,你可以自己自定图标. 返回值为一整数值,依用户按下什么钮而定,YES_OPTION=0,NO_OPTION=1,CANCEL_OPTION=2,OK_OPTION=0 ,CLOSED_OPTION=-1(当用户都不选直接关掉对话框时)
-
-
输入对话框:
-
Object showInputDailog(Component parentComponent,Object message,String title,int messageType,Icon icon ,Object[] selectionValues,Object initialSelectionValue) //当用户按下确定按钮时会返回用户输入的信息,若按下取消按钮则返回null.
-
parentComponent:是指产生对话框的组件为何,通常是指Frame或Dialog组件
-
message:是指要显示的组件,通常是String或Label类型
-
title:对话框标题列上显示的文字
-
messageType:指定信息类型,共有5种类型,分别是:
- ERROR_MESSAGE,INFORMATION_MESSAGE,WARING_MESSAGE, QUESTION_MESSAGE,PLAIN_MESSAGE(不显示图标).指定类型后对话框就会出现相对应的图标
-
icon:若你不喜欢java给的图标,你可以自己自定图标
-
selectionValues:给用户选择的可能值.Object Array中的数据会以ComboBox方式显示出来
-
initialSelectionValue:对话框初始化时所显示的值
-
-
消息对话框:
-
void showMessageDialog(Component parentComponent,Object message,String title,int messageType,Icon icon) void showInternalMessageDialog(Component parentComponent,Object message,String title,int messageType ,Icon icon)
-
parentComponent:是指产生对话框的组件为何,通常是指Frame或Dialog组件
-
message:是指要显示的组件,通常是String或Label类型
-
title:对话框标题列上显示的文字
-
messageType:指定信息类型,共有5种类型,分别是:
- ERROR_MESSAGE,INFORMATION_MESSAGE,WARING_MESSAGE, QUESTION_MESSAGE,PLAIN_MESSAGE(不显示图标).指定类型后对话框就会出现相对应的图标
-
icon:若你不喜欢Java给的图标,你可以自己自定图标
-
-
选项对话框:
-
显示选择对话框,这类的对话框可以让用户自定义对话类型,最大的好处是可以改变按钮上的文字
-
int showOptionDialog(Component parentComponent,Object message,String title,int optionType,int messageType,Icon icon,Object[] options,Object initalValue) int showInternalOptionDialog(Component parentComponent,Object message,String title,int optionType, int messageType,Icon icon,Object[] options,Object initialValue) //返回值为一整数值,依用户按下什么钮而定(按钮序号)
-
parentComponent:是指产生对话框的组件为何,通常是指Frame或Dialog组件
-
message:是指要显示的组件,通常是String或Label类型
-
title:对话框标题列上显示的文字
-
optionType:确定按钮的类型,有5种类型,分别是DEFAULT_OPTION,YES_NO_OPTION,YES_NO_CANCEL,与 OK_CANCEL_OPTION.
-
messageType:指定信息类型,共有5种类型,分别是:
- ERROR_MESSAGE,INFORMATION_MESSAGE,WARING_MESSAGE, QUESTION_MESSAGE,PLAIN_MESSAGE(不显示图标).指定类型后对话框就会出现相对应的图标
-
icon:若你不喜欢Java给的图标,你可以自己自定图标
-
options:给用户选择的按钮显示文字
-
initalValue:对话框初始化时按钮默认值
-
8.4.2 Swing常用基本组件
-
JLable:
-
JLable组件被称为标签,它是一个静态组件,也是标准组件中最简单的一个组件。每个标签用一个标签类的对象表示,可以显示一行静态文本。标签只起信息说明的作用,而不接受用户的输入,也无事件响应
-
JLable(String text) //创建一个带文字的标签 JLable(String text,int halig)//创建一个含有文字的标签,并指定水平排列方式 String getText( ) //获取此标签的文本 void setText(String lable)//设置标签的文本
-
-
JButton:
-
JButton(String text) //创建一个有标签的按钮 JButton(String text, Icon icon) //创建一个有标签和图标的按钮 String getText( ) //获取按钮的文本 void setText(String lable) //设置按钮的文本
-
-
JCheckBox:
-
JCheckBox组件被称为复选框,它提供 “选中/ON”和“未选中/OFF”两种状态。用户点击某复选框就会改变该复选框原有的状态
-
JCheckBox(String text) //创建一个有标签的复选框对象 JCheckBox(String text,boolean selected) //创建一个有标签的复选框对象,且初始状态为false boolean isSelected() //判断复选框是否被选中 void getText( ) //获取复选框
-
-
JRadioButton:
-
JRadioButton组件被称为单选按钮,在Java中JRadioButton组件与JCheckBox组件功能完全一样,只是图形不同,复选框为方形图标,选项按钮为圆形图标
-
JRadioButton(String text) //创建一个有标签的单选按钮 JRadioButton(String text,boolean selected) //创建一个有标签的单选按钮,且初始状态为false boolean isSelected() //判断单选按钮是否被选中 void getText() //设置单选按钮的文本
-
-
JTextField:
-
JTextField被称为文本域,它定义了一个单行条形文本区,可以输出任何基于文本的信息,也可以接受用户的输入。而JPasswordField是其子类
-
JTextField(int n) //创建一个列宽为n的空JTextField对象 JTextField(String s) //创建一个JTextField对象,并显示字符串s void addActionListener(ActionListener e) //添加指定的动作事件监听程序
-
-
JTextArea:
-
JTextArea被称为文本区。它与文本框的主要区别是:文本域只能输入/输出一行文本,而文本域可以输入/输出多行文本
-
JTextArea(String s) //创建一个JTextArea对象 JTextArea (int n,int m) //创建一个具有n行m列的空JTextArea对象 void append(String str) //将指定的文本添加到末尾
-
-
JComboBox:
-
下拉列表的特点是将多个选项折叠在一起,只显示最前面的或被选中的一个。选择时需要单击下拉列表右边的下三角按钮,这时候会弹出包含所有选项的列表
-
JComboBox(Object[] items) //使用数组构造一个JComboBox对象 JComboBox() //创建一个空的 JComboBox 对象 void addItem(Object anObject) //将指定的对象作为选项添加到下拉列表框中 Object getSelectedltem() //获取当前选择的项
-
-
JList:
- 列表框(JList)与下拉列表框(JCombox)的区别不仅表现在外观上,当激活下拉列表框时,会出现下拉列表框中的内容,但列表框只是在窗体上占据固定的大小,如果需要列表框具有滚动效果,可以将列表框放入滚动面板中
-
JScrollPane:
- JScrollPane是带有滚动条的面板。ScrollPane是Container类的子类,也是一种容器,但是只能添加一个组件。在Swing中,像JTextArea、JList、JTable等组件都没有自带滚动条,都需要将它们放置于滚动面板,利用滚动面板的滚动条,浏览组件中的内容
-
JFileChooser:
-
JFileChooser():创建一个指向用户默认目录的 JFileChooser。 JFileChooser(String currentDirectoryPath):创建一个使用指定路径的 JFileChooser
-
-
JProgressBar:
-
//创建一个最小值是0,最大值是100的进度条 JProgressBar pgbar=new JProgressBar(0,100); //创建一个最小值是0,最大值是60,当前值是20的进度条 JProgressBar pgbar=new JProgressBar(0,60,20); ```=
-