Java程序设计大学教程第六章 图形用户界面本章讲解 Java图形界面应用程序的一般设计方法,包括如何创建窗体、设计界面、管理布局、绘制图形、使用组件、事件编程等。
通过这一章的学习要求重点掌握图形用户界面应用程序的设计方法和编程技巧。
Java程序设计大学教程
6.1 GUI编程基础
图形用户界面( GUI)使用户可以和程序进行可视化交互。无论是程序的设计者还是使用者都可以通过图形用户界面明显
,看到,和,感觉,到程序的存在。图形用户界面为不同的应用程序提供了感觉上一致的用户界面组件,这样使用户在记住执行功能的复杂命令上花费较少的时间,而花更多的时间通过有效的方式来使用程序。
一个设计良好的软件通常包括业务层的逻辑设计和表现层的用户界面设计两大部分。因此,好的用户界面设计对一个系统的成功是至关重要的。一个使用起来困难的界面,轻者会造成用户操作不便;重者引起用户反感,不管系统的功能如何而拒绝使用该软件系统。如果信息的表达方式是混乱的或是容易误解的,那么用户可能会误解信息的涵义。他们进行的一系列操作就有可能破坏数据,甚至导致灾难性的系统失败。
Java程序设计大学教程
6.1.1 图形用户界面
计算机操作界面的发展从单调的命令行形式到图形化窗口形式,逐步形成了现在计算机用户认可的图形用户界面主要特征,主要集中在窗口、图标、菜单、指点、图形等方面。
用户界面设计的一般性原则包括:用户熟悉、一致性、
意外最小化、可恢复性、用户指南、用户差异性等。
图形用户界面包含了许多独立的显示元素,供用户交互。
它们由程序中的 GUI组件组成。 GUI组件是用户通过键盘或鼠标进行交互的对象,菜单、按钮、文本域、标签和下拉列表框等 GUI组件是图形用户界面的常用部分。
Java程序设计大学教程
6.1.2 Swing和 ATW
Java类库中的 ATW和 Swing包提供了大量的可视化组件,AWT组件是建立在对等模型的基础上的重量级组件;而 Swing组件则是用纯 Java编写的轻量级组件。
Swing带来了以下优势:
更丰富、更方便的用户界面元素集。
对底层平台的依赖更少,因此和平台有关的 bug也少得多。
给不同平台上的用户一致的感觉。
AWT与 Swing的结构关系以及 Swing的组件关系
Java程序设计大学教程
6.1.3 窗体容器
窗体(也叫 Windows)是显示在用户终端桌面上的图形元素。
窗体可以充当各种组件和控件的一个容器。 Java中的窗体类容器可能是一个对话框( Dialog)、框架( Frame)或者是一个面板( Panel)等。
Java中的主要窗体类容器如下:
JApplet 通过启用 Java 的 Web浏览器或其他 Apple 查看器运行的程序。
JDialog 汇集用户输入的模式或无模式窗口。
JFrame 顶层应用程序窗口。
JPanel 容纳部分界面的小型容器。反过来,该容器又可用于其他任何容器中,如 JFrame,JPanel,JApplet或
JDialog组件。
AWT窗体 基于 AWT的可视窗体。 AWT窗体包括 Applet、
对话框、框架和面板。 AWT与 Swing的结构关系以及
Swing的组件关系
Java程序设计大学教程
6.1.3 窗体容器
框架( JFrame)是 — 种常用的顶层容器。框架的内部结构比较复杂,它可以划分为 4种窗格:根窗格( Root Pane)、
布局窗格( Layered Pane)、内容窗格( Content Pane)
和玻璃窗格( Glass Pane)。
对 JFrame添加组件有两种方式,1、用 getContentPane方法获得 JFrame的内容窗格,再对其加入组件; 2、建立一个
JPanel之类的中间容器,把组件添加到容器中,用
setContentPane方法把该容器置为 JFrame的内容窗格。
面板( JPanel)有一个能够在上面进行绘制的表面,而且其本身也是容器。因此,它除了可以绘制图形、文字,还能容纳按钮、滑动条等其他用户界面元素。
Title JFrame
Menu
RootPane
Layered Pane
ContentPane
Class Pane
MenuBar
1、用 getContentPane方法获得 JFrame的内容窗格,再对其加入组件:
frame.getContentPane().add(childComponent);
2、建立一个 JPanel之类的中间容器,把组件添加到容器中,用
setContentPane方法把该容器置为 JFrame的内容窗格:
JPanel contentPane=new JPanel( );
…… //把其它组件添加到 JPanel中 ;
frame.setContentPane(contentPane);
//把 contentPane对象设置成为 frame的内容窗格
Java程序设计大学教程
6.2 图形与绘图
在 Java中用于绘制文字、图形、图像的是
Graphics类,并通过图形组件的
paintComponent方法实现绘制工作。
我们通常把 Graphics称为与 Swing组件关联的图形上下文( graphic context),因为它包含了各种绘图的方法。
Graphics是抽象类,不能直接创建 Graphics对象,只能通过 JPanel或 JComponent的派生类得到一个 Graphics对象。
Java程序设计大学教程
6.2.1 坐标系统
图形上下文使用一个简单的坐标系统,这个坐标系统中的每个图形元素(像素)用 x和 y的坐标来表示。坐标系统的原点,其坐标为( 0,0),位于组件的左上角。 x
坐标表示一个点与原点的水平距离,y坐标表示一个点与原点的垂直距离。 x坐标从左到右增大,y坐标从上到下增大
x轴
y轴 ( x,y)
( 0,0) ( 1,0) ( 2,0)
( 0,1)
( 0,2)
( 1,1)
width 宽
height
高原点
(坐标单位:像素)
Java程序设计大学教程
Color redColor=new Color(255,0,0);//红色
Color redColor=Color.RED;//红色
6.2.2 颜色
Java中有专门处理颜色的类 Color。
Java的颜色是根据 RGB值来建立的。 RGB值是用于指定红色、绿色和蓝色这 3个分量的数字组合,三基色混合在一起形成了最终的颜色。 Color对象可以由代表红色、绿色和蓝色的 3个单独的 RGB值创建,RGB取值范围为 0到
255之间的整数。
Color类还定义了一些标准的颜色,作为类常量使用。这些颜色可以用来直接定义新的 Color对象
Java程序设计大学教程
6.2.3 绘图
画线
drawLine(int x1,int y1,int x2,int y2)
该方法将用当前的颜色以( x1,y1)为起点,( x2,y2)为终点画一条直线。
画矩形
void drawRect(int x,int y,int width,int height)
void fillRect(int x,int y,int width,int height)
drawRect方法和 fillRect方法分别可以用来绘制一个矩形的轮廓和一个被填充的矩形。
矩形的左上角在( x,y),矩形的大小由参数 width和 height来确定
画椭圆和圆
void drawOval(int x,int y,int width,int height)
void fillOval(int x,int y,int width,int height)
用 drawOval方法可以绘制一个椭圆。而用 fillOval方法可以填充一个椭圆。
椭圆被绘制在一个矩形范围内,这个矩形的左上角是 (x,y),而大小由参数 width和 height确定。
绘制圆形时,我们只需指定矩形为一个正方形。
画圆弧
void drawArc(int x,int y,int width,int height,int startAngle,
int sweepAngle)
void fillArc(int x,int y,int width,int height,int startAngle,
int sweepAngle)
圆弧被绘制在一个矩形范围内,这个矩形的左上角是 (x,y)点,而大小由参数 width和 height确定。
圆弧是以 startAngle为开始的角度,sweepAngle为转过的角度而绘制的。这些角是以度为单位的。
画多边形
void drawPolygon(int x[ ],int y[ ],int numPoints)
void fillPolygon(int x[ ],int y[ ],int numPoints)
x轴
y轴
( x+d/4,y+d/2)
( 0,0)
( x,y)
width
height
原点
(坐标单位:像素)
d
d/2
( x+d/2,y+d/4)
( x,y+d/4)
( x+d*3/4,y+d/2)
import javax.swing.*;
import java.awt.*;
public class Dao extends JFrame{
public Dao() {
setSize(width,height);//设置框架大小
setTitle("道 ");//设置框架标题
//将框架显示在屏幕正中
Toolkit kit= Toolkit.getDefaultToolkit();
Dimension screenSize=kit.getScreenSize();
int x=(screenSize.width-width)/2;
int y=(screenSize.height-height)/2;
setLocation(x,y);//设置框架位置
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String args[]) {
Dao frame=new Dao();
DrawPanel drawPanel=new DrawPanel( );
//把其它组件添加到面板中 ;
frame.setContentPane(drawPanel);
frame.setVisible(true);
}
int width=400;
int height=300;
}
class DrawPanel extends JPanel{
public DrawPanel(){
setBackground(Color.GRAY);
}
//在面板中绘制太极图形 ;
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.BLACK);
g.fillArc(x,y,d,d,0,180);
g.setColor(Color.WHITE);
g.fillArc(x,y,d,d,180,180);
g.setColor(Color.BLACK);
g.fillArc(x+d/2,y+d/4,d/2,d/2,180,180);
g.setColor(Color.WHITE);
g.fillArc(x,y+d/4,d/2,d/2,0,180);
g.fillOval(x+d*3/4-5,y+d/2-5,10,10);
g.setColor(Color.BLACK);
g.fillOval(x+d/4-5,y+d/2-5,10,10);
}
int x=100;
int y=40;
int d=200;
}
绘制太极图的程序 Dao.java
Java程序设计大学教程
6.3 事件处理模型
事件是由程序检测到的行为和动作。在一个应用程序中,程序员通常无法预测用户下一个将要执行的动作。用户可能会选择一个菜单项,
单击一个按钮或者文本框。为了解决这个问题,
程序员可以编写代码来处理感兴趣的事件,而不是编写那些全都按照一定顺序执行的代码。
许多流行的应用程序之所以称为是事件驱动的,
是因为它们是为响应事件而设计的。
Java程序设计大学教程
6.3.1 事件和 Java事件模型
图形用户界面是事件驱动的。事件是由程序检测到的行为和动作。导致该事件发生的对象称为事件源。事件处理程序是处理事件和执行任务的方法,
它与所触发的事件关联。
Java事件处理模型一般包括用户事件和系统事件 。
Java事件模型是一种,源 -监听器,模型。事件监听器是一个实现了专门的监听器接口的对象,而事件源是一个能注册监听器,并向他们发送事件的对象。当事件源产生某个事件时,它会向注册在那个事件上的所有监听器发送事件通知,以便执行相应的事件处理程序。
Java程序设计大学教程
6.3.2 事件处理实例分析一个 Java事件处理模型的具体步骤如下:
1,创建事件监听器
2,注册事件监听器
3,创建事件对象
4,通知事件发生
5,执行事件处理程序
panel:ColorPanel
ActionEvent
ColorActionListener
colorButtonactionPerformed()
setColor()
1
2
addActionListener()
3
4
5
容器事件源监听器
private class ColorActionListener implements ActionListener {
public void actionPerformed(ActionEvent event){
setColor();
}
}
……
colorButton.addActionListener(new ColorActionListener());
Java程序设计大学教程
6.3.3 内部类
在一个类内部声明的类称为内部类。没有为其取名建立引用变量的内部类称为匿名内部类。这种类的创建通常不与外界发生关系,
仅供一次性使用。这种编程方法对于即时创建对象,处理监听任务是合适的。
如果类 B被定义在类 A的内部,类 B称为类 A的内部类,类 A称为类
B的包围类。类 B仅为类 A所知,仅限类 A所用。内部类 B可以访问包围类 A的所有成员,包括私有成员;但反之则不行,因为内部类的成员仅限其内部使用,不能被其外部的任何类使用。
brighterButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
setBrighter();
}
});
Java程序设计大学教程
6.3.4 常用组件的事件
在 Java里,所有的事件都用 java.util.EventObject
类的一个派生类来表示。
GUI界面上发生的事件,即
AWT事件,作为
java.awt.AWTEvent的一个派生类来定义,
java.awt.AWTEvent是
EventObject的一个派生类。
虽然对 AWT与 Swing类来说,事件模型是相同的,但
Swing包引入了许多额外的事件。
Java事件对象的层次结构
Java程序设计大学教程
6.4 使用 Swing组件使用 Swing组件可以快速构建用户图形界面,为用户操作提供更多的便利性。
MVC模型
布局管理
Swing组件编程
Java程序设计大学教程
6.4.1 MVC模型
MVC是面向对象设计中经典的模型之一,用该模型设计的组件可以从三个独立的方面来观察:它在什么状态
(模型),它看起来是什么模样(视图)以及它做些什么(控制器)。这种设计的主要优点在于模型、视图与控制器之间的无关性,并实现不同观感的即插即用。
Swing使用了模型 — 视图 — 控制器( Model-View-
Controller,MVC)模型,把图形组件的外观与其内容和操控分离开,可以实现不同的观感。
按钮的 MVC模型
Java程序设计大学教程
6.4.2 布局管理
Java图形界面编程中使用灵活的布局管理器来组织和管理一个容器里界面元素的布局。它执行的任务有:决定容器的全面尺寸、决定容器里每个元素的大小、决定元素之间的间隔、决定元素的位置。
Java编程中使用的布局管理器有,FlowLayout、
BorderLayout,GirdLayout,BoxLayout、
CardLayout,GridBagLayout,OverlayLayout。其中前三种最常用。
一些常见的 Swing容器类有着自己的缺省布局,例如:
JFrame,JWindow,JDialog,JApplet的缺省布局是
BorderLayout; JPanel的缺省布局是 FlowLayout;
Box的缺省布局是 BoxLayout。
Java程序设计大学教程
6.4.3 Swing组件编程
Swing组件从功能上分可分为:
顶层容器 有 JFrame,JApplet,JDialog,JWindow共 4
个。
中间容器 有 JPanel,JScrollPane,JSplitPane、
JToolBar,Box等。
特殊容器 在 GUI上起特殊作用的中间层,例如:
JInternalFrame,JLayeredPane,JRootPane。
基本组件 实现 GUI交互的组件,例如,JButton、
JComboBox,JList,JTextField等。
不可编辑信息的组件 向用户显示不可编辑信息的组件,例如,JLabel,JProgressBar。
可编辑信息的组件 向用户显示能被编辑的格式化信息的组件,例如,JColorChooser,JFileChooser,JTable、
JTextArea。
常用的基本 GUI组件如下:
标签( JLabel)
文本域( JTextField)
文本区( JTextArea)
按钮( JButton)
单选框( JRadioButton)
复选框( JCheckBox)
下拉框( JComboBox)
列表框( JList)
GUI程序设计的一般流程:
1、引入 Swi g等相关的包
2、选择观感( LookAndFeel)
3、设置顶层容器
4、声明和创建 GUI组件
5、设置 GUI组件
6、添加边框
7、向容器中添加组件及管理布局
8、进行事件处理