GUI图形用户界面设计与 Java事件驱动模型北京理工大学计算机系 金旭亮第十四讲
2009-7-29 2北京理工大学计算机系 (共 62页)
本讲内容
GUI程序设计
事件驱动模型
GUI界面设计第一部分
2009-7-29 4北京理工大学计算机系 (共 62页)
AWT
Abstract Window ToolKit
Java GUI
AWT 抽象层底层的窗口系统 分操作系统的
2009-7-29 5北京理工大学计算机系 (共 62页)
JFC
JFC( Java Foundation Class):是一组与 GUI
有关的类,是为解决不同的 AWT平台问题而创建的,它支持:
( 1)可插入风格:运行时可动态选择外观
( 2)用于访问大型文本文件的 API;
( 3) Java 2D API;
( 4)拖放库和 Undo功能库
( 5) Swing组件集
2009-7-29 6北京理工大学计算机系 (共 62页)
SWING与 AWT
SWING组件的基类是 JComponent,它的继承树是:
java.lang.Object
java.awt.Component
java.awt.Container
javax.swing.JComponent
2009-7-29 7北京理工大学计算机系 (共 62页)
轻量级组件与重量级组件
重量级组件由不同平台的操作系统负责绘制。
轻量级组件完全由 Java“画出,。
轻量级组件 Swing采用画布 Canvas作为底层支持,但其它行为是用 Java实现的。
2009-7-29 8北京理工大学计算机系 (共 62页)
GUI程序设计的基本思路
1.声明一个控件变量并创建控件实例
2.实现若干事件接口,提供事件处理程序,
以响应事件
3.往 GUI容器中添加控件
2009-7-29 9北京理工大学计算机系 (共 62页)
显示组件
组件显示前需要加入到容器中。常用的容器有 JFrame.
代码:
JButton jb=new JButton(“pressure”);
jFrame.getContentPane().add(jb);
jFrame.setVisible(true);
2009-7-29 10北京理工大学计算机系 (共 62页)
JLabel
LabelDemo.java 生成带图标的标签:
ImageIcon icon = new ImageIcon("star.gif");
JLabel jl = new JLabel("You are a star",icon,
JLabel.CENTER);
2009-7-29 11北京理工大学计算机系 (共 62页)
JButton
ButtonDemo2.java 生成带图象的按钮
Icon spIcon = new
ImageIcon("spam.jpg");
final JButton jb = new JButton("press
here for Spam",spIcon);
2009-7-29 12北京理工大学计算机系 (共 62页)
JTextField
TextDemo.java
2009-7-29 13北京理工大学计算机系 (共 62页)
JTextField
创建文本框:
JTextField jtf = new JTextField(25);
JLabel jl = new JLabel("Enter your name:");
Container c = jframe.getContentPane();
c.add( jl );
c.add( jtf );
2009-7-29 14北京理工大学计算机系 (共 62页)
JTextField
获取文本框中的内容:
jtf.addActionListener( new ActionListener()
{
public void actionPerformed(ActionEvent e)
{ System.out.println(" you entered," +
e.getActionCommand() ); }
} );
2009-7-29 15北京理工大学计算机系 (共 62页)
JCheckBox
CheckDemo.java:生成界面代码
JCheckBox jck1 = new JCheckBox("Pepperoni");
JCheckBox jck2 = new JCheckBox("Mushroom");
JCheckBox jck3 = new JCheckBox("Black olives");
JCheckBox jck4 = new JCheckBox("Tomato");
Container c = jframe.getContentPane();
c.add( jck1 ); c.add( jck2 ); c.add( jck3 ); c.add( jck4 );
2009-7-29 16北京理工大学计算机系 (共 62页)
JPanel
PanelDemo.java
使用标签来给面板加上图片。
2009-7-29 17北京理工大学计算机系 (共 62页)
JOptionPane( 1)
OptDemo.java:显示对话框
2009-7-29 18北京理工大学计算机系 (共 62页)
JOptionPane( 2)
Icon spicon = new ImageIcon("spam.jpg");
JLabel jl = new JLabel("Are you getting enough?",
spicon,JLabel.CENTER);
JOptionPane.showMessageDialog( jframe,//
parent
jl,// Object to display
"Plenty of spam",
JOptionPane.QUESTION_MESSAGE );
2009-7-29 19北京理工大学计算机系 (共 62页)
JScrollPane( 1)
ScrollDemo.java
2009-7-29 20北京理工大学计算机系 (共 62页)
JScrollPane( 2)
MyJPanel mjp = new MyJPanel();
JScrollPane jsp = new JScrollPane( mjp );
jsp.setPreferredSize( new Dimension(150,
150));
jframe.getContentPane().add(jsp);
2009-7-29 21北京理工大学计算机系 (共 62页)
课后练习
还有其他的 GUI组件,课后同学们可以从其它书籍或 JDK中学习使用它们。
2009-7-29 22北京理工大学计算机系 (共 62页)
容器与控件
控件( Control),指屏幕上的软件元素,
如一个按钮;
容器( Container),是一些实际上含有多组控件或其他容器的屏幕窗口。在一个操作中,可以移动、隐藏或显示一个容器及其所有内容。顶级容器可以显示在屏幕上,
非顶级容器必须处于顶级容器中才可以被显示。
2009-7-29 23北京理工大学计算机系 (共 62页)
常见的 SWING容器
JRootPane
JLayerPane
JContentPane
JGlassPane
JPane
JFrame:完整的窗口,有标题栏等
JApplet
JWindow:空白窗口,甚至没有边框
2009-7-29 24北京理工大学计算机系 (共 62页)
修改 JFrame的图标
IconDemo.java
2009-7-29 25北京理工大学计算机系 (共 62页)
容器中的布局
使用布局管理器来处理 GUI控件的定位。
2009-7-29 26北京理工大学计算机系 (共 62页)
FlowLayout
FlowDemo.java
2009-7-29 27北京理工大学计算机系 (共 62页)
GridLayOut
GridDemo.java
2009-7-29 28北京理工大学计算机系 (共 62页)
BorderLayout
BorderDemo.java
2009-7-29 29北京理工大学计算机系 (共 62页)
BoxLayout
BoxDemo2.java
2009-7-29 30北京理工大学计算机系 (共 62页)
组合布局
GroupDemo.java
2009-7-29 31北京理工大学计算机系 (共 62页)
组合布局
GroupDemo2.java
事件驱动模型第三部分
2009-7-29 33北京理工大学计算机系 (共 62页)
事件模型
Java中事件处理总体流程图
2009-7-29 34北京理工大学计算机系 (共 62页)
使用事件委托处理模型
1.写出一个实现 SomethingListener接口的类
2.声明类的一个对象,如 myHandler
3.对组件调用
addSomethingListener(myHandler)方法
2009-7-29 35北京理工大学计算机系 (共 62页)
实例分析
手写的 Java事件处理程序,TheSimplestEvent
2009-7-29 36北京理工大学计算机系 (共 62页)
ActionListener接口
从事件基类 EventListener派生而来:
Public interface ActionListener extends
EventListener
ActionListener接口只有一个方法:
Public void actionPerformed(ActionEvent e)
事件基类接口 EventListener没有任何成员!
2009-7-29 37北京理工大学计算机系 (共 62页)
Java的事件对象类库
2009-7-29 38北京理工大学计算机系 (共 62页)
Java GUI程序的事件驱动模型
2009-7-29 39北京理工大学计算机系 (共 62页)
事件委托处理模型
基本原理:
用户引发的事件被传递给相应组件,组件注册了一个事件处理程序,对事件的处理由组件委托给包含了事件处理程序的类来处理。
每个事件都有一个处理程序(放在对应的事件处理类中),这个类称为 事件监听器类 。为了实现通用性,
这个类被实现为接口,由程序员自己生成一个类(实现这一接口),并编写事件响应代码。
2009-7-29 40北京理工大学计算机系 (共 62页)
Java事件驱动模型的实现
2009-7-29 41北京理工大学计算机系 (共 62页)
使用内部类简写事件处理程序
示例工程,JavaEventExample
1,Simple1.java---内部类
2,Simple2.java---内部匿名类
2009-7-29 42北京理工大学计算机系 (共 62页)
内部类实例
ButtonTest.java
2009-7-29 43北京理工大学计算机系 (共 62页)
Java事件处理模型的灵活性
为一个组件注册多个监听程序
为多个组件注册同一个监听程序
实例,TheSimplestExample2.java
2009-7-29 44北京理工大学计算机系 (共 62页)
多点传送
MulticastTest.java:同时关闭多个窗体
主窗体为一个类,面板为一个类,空白窗体为一个类。
多路委托
GUI程序实例分析
2009-7-29 46北京理工大学计算机系 (共 62页)
处理菜单事件
实例,ImageViewer.java
2009-7-29 47北京理工大学计算机系 (共 62页)
处理单选钮事件
PlatForm.java
2009-7-29 48北京理工大学计算机系 (共 62页)
JRadioButton和 ButtonGroup
实例:
RadioDemo.java
2009-7-29 49北京理工大学计算机系 (共 62页)
处理键盘事件
实例,Sketch.java
2009-7-29 50北京理工大学计算机系 (共 62页)
处理鼠标事件
,小画家,程序:左键绘图,右键擦除
示例源码,Painter
2009-7-29 51北京理工大学计算机系 (共 62页)
Painter程序分析
处理鼠标事件:
1,单击,MouseListener
2,移动,MouseMotionListener
上面的都是接口!
注意:
代码中有很多空的方法体,不能去掉。
为什么?
2009-7-29 52北京理工大学计算机系 (共 62页)
使用事件适配器
事件适配器:实现某一特定事件接口的所有方法,只不过方法为空。定义适配器是为了简化事件处理的代码量。这时,只需继承一个事件类,覆盖其中感兴趣的事件代码就行了。
事件适配器其实是一种 Adapter设计模式。
2009-7-29 53北京理工大学计算机系 (共 62页)
事件适配器类的实例
给窗体加上关闭功能
//给窗口增加关闭功能
WindowListener w=new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
};
this.addWindowListener(w);
2009-7-29 54北京理工大学计算机系 (共 62页)
仔细分析 WindowAdapter
使用 JDK帮助查看 WindowAdapter类的情况:
( 1)实现接口:
EventListener(基类接口),WindowFocusListener,
WindowListener,WindowStateListener
( 2)此类的成员:
public void windowActivated(WindowEvent e)实现接口 WindowListener
public void windowStateChanged(WindowEvent e)
实现 接口 WindowStateListener
……
2009-7-29 55北京理工大学计算机系 (共 62页)
自我练习
将,小画家,应用程序 Painter用事件适配器模式重写。
MouseAdapterMouseListener
MouseMotionAdapterMouseMotionListener
2009-7-29 56北京理工大学计算机系 (共 62页)
使用适配器处理鼠标事件
MouseTest.java,
2009-7-29 57北京理工大学计算机系 (共 62页)
处理文本框的 TextChange事件
实例,TextTest.java
2009-7-29 58北京理工大学计算机系 (共 62页)
剖析时钟程序
JTextField以 MVC模式实现。
当文本框的文字改变时,相当于 Document
发生了改变,将会调用
insertUpdate,removeUpdate和
changedUpdate三个方法。这三个方法是
DocumentListener接口的成员。
需要理解 MVC模式的含义。
2009-7-29 59北京理工大学计算机系 (共 62页)
文本编辑器
一个功能比较完备的程序
2009-7-29 60北京理工大学计算机系 (共 62页)
课后练习
仔细分析 JDK源代码中有关事件的部分,画出 UML类图,分析理解事件驱动系统的原理。
研究 JDK所提供之 Java 2D示例程序,在
Demo文件夹下的 jfc子文件夹下。