第四部分图形界面设计:AWT u AWT概述
u事件处理模型
u布局管理模型
u AWT构件
4.1 AWT概述
u Abstract Window Toolkit u AWT软件包及其作用:
–为用户提供基本的界面构件;
–事件处理、剪贴板、数据传输、图象操作;
–2D API
u构件:AWT的基础
u构件、容器和布局管理器
4.1.1 AWT软件包
Java.awt
Java.awt.accessibility Java.awt.color Java.awt.datatransfer Java.awt.dnd
Java.awt.event Java.awt.font Java.awt.geom
Java.awt.im
Java.awt.image
Java.awt.peer
Java.awt.print
Java.awt.swing
Java.awt.test
Java.awt.peer
Java 程序Java AWT本地窗口系统
同位体
显示
一个Java程序创建并显示AWT构件,AWT构件创建并显示本地构件(同位体)。
4.1.2 AWT构件
u Component
Menu、Button、Label、List等构件的抽象基类。
u Container
可以包含多个构件的构件。
u LayoutManager
定义容器中构件位置和尺寸方法的接口。
u Graphics
定义构件内图形操作的基本类。每个构件都有一个相关的图形对象。
Component
Container
Window Panel
Frame
Dialog
Button Canvas CheckBox Choice Label List ScrollBar TextComponent
TextArea TextField ScrollPane
Applet
https://www.doczj.com/doc/1c14242661.html,ponent u图形对象
u位置
u尺寸
u本地同位体
u父容器
u字体和字体尺度
u前景和背景颜色
u地点场所
u最小值、最大值和首选尺寸
布局管理器u BorderLayout
u CardLayout
u FlowLayout
u GridLayout
u GridBagLayout 4.1.3 构件、容器和布局管理器
LayoutManager
Component
Container
1
n
小结
Component、Container、LayoutManager、Graphics:
u容器包含构件。
u布局管理器确定容器内构件的位置和形状。
u图形类提供在构件中显示文本框和图形的方法。
4.2 事件处理模型u GUI与事件驱动
u继承事件模型(旧)
u授权事件模型(新)
4.2.1 GUI与事件驱动u GUI
u事件驱动import java.awt.*;
import java.awt.event.*;
import java.applet.*;
public class MouseSensorApplet extends Applet {
public void init() {
setLayout(new BorderLayout());
add(new MouseSensorCanvas(), "Center");
}
}
class MouseSensorCanvas extends Canvas {
public boolean mouseDown(Event event, int x, int y) {
System.out.println(whichMouseButton(event) + ": Down");
return true;
}
public boolean mouseUp(Event event, int x, int y) {
System.out.println(whichMouseButton(event) + ": Up");
return true;
}
private String whichMouseButton(Event event) {……}
}
4.2.2 继承事件模型u什么是继承事件模型
构件:事件产生+事件处理
事件处理:继承+覆盖
u事件处理方法
u事件的传播
事件处理方法u自处理事件的处理
u被传播事件的处理
–构件内传播
–事件的向外传播
自处理事件的处理
常覆盖的构件方法:事件void setSize(int w,int h); 调整大小
void setBounds(int x,int y,int w,int h); 调整大小并/或移动void paint(Graphics g); 绘制构件
void update(Graphics g); 清除并重绘
void addNotify() 创建同位体
被传播事件的处理u什么是被传播事件
构件内传播,其它辅助方法处理
向构件外传播,超类或容器处理
u handleEvent(event)方法
import java.applet.Applet;
import java.awt.*;
public class CanvasEventExample
extends Applet {
public void init() {
MouseCanvas canvas = new MouseCanvas();
setLayout(new BorderLayout());
add(canvas, "Center");
}
}class MouseCanvas extends Canvas {
public boolean handleEvent(Event event) {
if(event.id== Event.MOUSE_DOWN) {
System.out.println("Mouse Down!");
return true;
}
//return super.handleEvent();
return false;
}
public boolean mouseUp(Eventevent, int x, int y) { System.out.println("Mouse Up!");
return true;
}
}
public boolean handleEvent(Event event) {
if(event.id== Event.MOUSE_DOWN) {
System.out.println("Mouse Down!");
return true;
}
return super.handleEvent();
//return false;
}
public boolean mouseUp(Eventevent, int x, int y) {
System.out.println("Mouse Up!");
return true;
//return super handleEvent();
//return super.mouseUp(,,);
}
}
u方法选择
1、继承并覆盖handleEvent()方法。
2、继承并覆盖action()、mouseXXXX()、
keyXXXX()、XXXXFocus()等辅助方法。
u传播方向
向构件所在容器传播,则handleEvent()方法返回FALSE;
不向构件所在容器传播,则handleEvent()方法返回TRUE;
由超类决定传播和处理,则handleEvent()方法返回super.handleEvent()
u没有完全处理的事件
如果使用的是handleEvent()方法,则返回super.handleEvent();
如果使用的是辅助方法,则返回辅助方法的超类实现。
被传播事件的辅助处理方法
boolean action() boolean mouseUp() Boolean mouseDown() boolean mouseDrag() boolean mouseMove() boolean mouseEnter() boolean mouseExit() boolean keyUp() boolean keyDown() boolean getFocus() boolean lost boolean()动作事件
释放鼠标
按下鼠标
拖动鼠标
移动鼠标
鼠标进入构件
鼠标离开构件
按键释放
按键被按下
构件得到焦点
构件失去焦点
继承事件模型的缺点
u事件的传播
–传送责任
–封装
u handleEvent()中的条件语句。
u UI逻辑与事件处理逻辑的混合。
4.2.3 授权事件模型
u事件模型中的三要素
构件(事件源)、事件、事件监听者u基本原理
u结构概述
u内部类的使用
u事件处理设计
1、基本原理
package eventnew_test ;import java.awt .*;
import java.awt.event .*;import java.applet .*;
public class Test extends Applet{
public void init(){
Button eventSource =new Button("Event Source");
eventSource.addActionListener ( new ButtonListener(this ));add(eventSource );}}
class ButtonListener
implements ActionListener {private Applet applet ;
public ButtonListener(Applet applet){this.applet = applet;}
public void actionPerformed(ActionEvent event){Button source =(Button)event.getSource ();
applet.showStatus(source.getLabel()+"activated ");}}
授权事件模型
事件源
事件监听者
事件
激发
注册
处理
Button.eventSource
new ButtonListener(this )
ActionEvent
激发
eventSource.addActionListener(new ButtonListener(this));
ButtonListener.actionPerformed
(ActionEvent event)
package eventnew_test;
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
public class Test
extends Applet{
public void init(){
Button eventSource=new Button("Event Source");
eventSource.addActionListener( new ButtonListener(this));
add(eventSource);
}
}class ButtonListener
implements ActionListener{
private Applet applet;
public ButtonListener(Applet applet){
this.applet= applet;
}
public void actionPerformed(ActionEvent event){ Button source =(Button)event.getSource();
applet.showStatus(source.getLabel()+"activated");
}
}
构件属性
行为
UI
事件处理布局管理
构件
属性
行为
UI
事件处理
布局管理器
构件
属性
行为
UI
事件监听者
事件处理
布局管理
2、结构概述
u事件源
u事件
u事件监听者
u适配器类
事件源
u构件
AWT构件提供监听者注册方法,允许某种类型的监听者注册感兴趣的事件。u多点传送事件源与单点传送事件源
AWT构件监听者注册方法
Button
CheckBox
CheckboxMenuItem
Choice
Component
Container
List
MenuItem
Scrollbar
TextArea
TextComponent
TextField
Window
void addActionListener(ActionListener)
void addItemListener(ItemListener)
void addComponentListener(
ComponetListener)
void addFocusListener(FocusListener)
void addInputmethodListener(
InputmethodListener)
void addKeyListener(KeyListener)
void addMouseListener(MouseListener)
void addMouseMotionListener(
MouseMotionListener)
void addContainerListener(ContainerListener)
void addAdjustmentListener(AdjustmentListener)
void addTextListener(TextListener)
void addWindowListener(WindowListener)
多点传送事件源与单点传送事件源u多点传送事件源
u单点传送事件源
事件
java.u t i l.
EventObject
AWTEvent
A c t i o n E v e n t Adjustment
Event
ComponnetEvent ItemEvent TextEvent
Container
Event
FocusEvent InputEvent P a i n t E v e n t WindowEvent
KeyEvent MouseEvent
构件事件和语义事件
u构件事件
ComponentEvent
ContainerEvent
FocusEvent
InputEvent
KeyEvent
MouseEvent
MouseMotionEvent
WindowEvent
u语义事件
由多个构件事件构成。
ActionEvent
AdjustmentEvent
ItemEvent
TextEvent
语义事件
改变文本
文本构件
TextEvent
切换复选框
选定菜单项
选定项目
选定项目
复选框
复选框菜单项
选择框
列表
IemEvent
移动滑动块
滚动条
AdjustmentEvent
激活按钮
双击按钮
选定项目
在域中回车
按钮、
列表、
菜单项
文本框
ActionEvent
激发条件
激发构件
语义事件
AWTEvent
u int getId()
u COMPONET_EVENT_MASK
FOCUS_EVENT_MASK
KEY_EVENT_MASK
MOUSE_EVENT_MASK
MOUSE_MOTION_EVENT_MASK
WINDOW_EVENT_MASK
ACTION_EVENT_MASK
ADJUSTMENT_EVENT_MASK
WindowEvent u Window getWindow()
u WINDOW_FIRST
WINDOW_LAST
WINDOW_ACTIVATED
WINDOW_DEACTIVATED
WINDOW_OPENED
WINDOW_CLOSING
WINDOW_CLOSED
WINDOW_ICONIFIED
WINDOW_DEiCONIFIED
事件监听者
EventListener
Action Listener Adjustment - Listener Component - Listener Focus- LIstener Container- Listener ItemListener
KeyListener
TextListener
Mouse Listener Mouse MotionListener
Window Listener
事件监听者与事件
u ActionEvent
u AdjustmentEvent u ComponentEvent u
ContainerEvent u FocusEvent u InputEvent u ItemEvent u KeyEvent u
MouseEvent u TextEvent
u
WindowEvent ()
u ActionListener
u AdjustmentListener u ComponentListenr u ContainerListener u FocusListener
u InputMethodListener u ItemListener u KeyListener u MouseListener
u MouseMotionListener u TextListener u
WindowListener
ActionListener
u actionPerformed(ActionEvent )u ACTION_EVENT/action()
WindowEvent & WindowListener
u
Window getWindow ()
u
WINDOW_FIRST WINDOW_LAST
WINDOW_ACTIVATED WINDOW_DEACTIVATED WINDOW_OPENED WINDOW_CLOSING WINDOW_CLOSED WINDOW_ICONIFIED WINDOW_DEICONIFIED
WindowListener 接口中的方法:
void windowActivated(WindowEvent )void windowDeactivated(WindowEvent )void windowOpened(WindowEvent )void windowclosed(WindowEvent )void windowClosing(WindowEvent )void windowIconified(WindowEvent )void windowEdiconified(WindowEvent )
适配器类
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
public class ButtonTest
extends Applet {
public void init(){
Button button= new
Button("Press Me");
button.addMouseListener(
new ButtonMouseListener());
add(button);
}
}class ButtonMouseListener
implements MouseListener{
public void mouseEntered(MouseEvent event){
System.out.println("Mouse Entered Button"); }
public void mouseExited(MouseEvent event){
System.out.println("Mouse Exited Button");
}
public void mousePressed(MouseEvent event){} public void mouseClicked(MouseEvent event){} public void mouseReleased(MouseEvent event){} }
class ButtonMouseListener
implements MouseListener{
public void mouseEntered(MouseEvent event){
System.out.println("Mouse Entered Button"); }
public void mouseExited(MouseEvent event){
System.out.println("Mouse Exited Button");
}
public void mousePressed(MouseEvent event){} public void mouseClicked(MouseEvent event){} public void mouseReleased(MouseEvent event){} }
如果使用适配器类
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
public class ButtonTest2 extends
Applet {
public void init(){
Button button= new
Button("Press Me");
button.addMouseListener(
new ButtonMouseListener2());
add(button);
}
}
class ButtonMouseListener2
extends MouseAdapter{
public void mouseEntered(MouseEvent
event){
System.out.println(
"Mouse Entered Button");
}
public void mouseExited(
MouseEvent event){
System.out.println(
"Mouse Exited Button");
}
}
class ButtonMouseListener2
extends MouseAdapter{
public void mouseEntered(MouseEvent event){ System.out.println("Mouse Entered Button"); }
public void mouseExited(MouseEvent event){ System.out.println("Mouse Exited Button"); }
}class ButtonMouseListener
implements MouseListener{
public void mouseEntered(MouseEvent
event){
System.out.println("Mouse Entered Button");
}
public void mouseExited(MouseEvent event){
System.out.println("Mouse Exited Button");
}
public void mousePressed(
MouseEvent event) {}
public void mouseClicked(MouseEvent event)
{}
public void mouseReleased(
MouseEvent event) {}
}
class ButtonMouseListener2
extends MouseAdapter{
public void mouseEntered(MouseEvent event){
System.out.println("Mouse Entered Button");
}
public void mouseExited(MouseEvent event){
System.out.println("Mouse Exited Button");
}
}
AWT适配器类
Adapter ComponentAdapter ContainerAdapter FocusAdapter KeyAdapter MouseAdapter MouseMotionAdapter WindowAdapter Listener Interface
ComponentListener
ContainerListener
FocusListener
KeyListener
MouseListener
MouseMotionListener
WindowListener
3、内部类的使用
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
public class ButtonTest2 extends
Applet {
public void init(){
Button button= new
Button("Press Me");
button.addMouseListener(
new ButtonMouseListener2());
add(button);
}
}
class ButtonMouseListener2
extends MouseAdapter{
public void mouseEntered(MouseEvent
event){
System.out.println(
"Mouse Entered Button");
}
public void mouseExited(
MouseEvent event){
System.out.println(
"Mouse Exited Button");
}
}
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
public class ButtonTest2
extends Applet {
Button button= new
Button("Press Me");
public void init(){
button.addMouseListener(
new ButtonMouseListener2());
add(button);
}class ButtonMouseListener2
extends MouseAdapter{
public void mouseEntered(MouseEvent event)
{
System.out.println("Mouse Entered Button");
}
public void mouseExited(MouseEvent event)
{
System.out.println("Mouse Exited Button");
}
}
}
public void init(){
button.addMouseListener( new MouseAdapter(){
public void mouseEntered(MouseEvent event) {
System.out.println("Mouse Entered Button");
}
public void mouseExited(MouseEvent event) {
System.out.println("Mouse Exited Button");
}
});
add(button);
}
使用匿名内部类
4.3 布局管理器u布局管理器的基本概念
u标准AWT布局管理器
BorderLayout
FlowLayout
CardLayout
GridLayout
GridBagLayout
4.3.1 基本概念
Component
Container
ScrollPane Panel Window
java.applet.
Applet
Dialog Frame
Layout
Manager
Menu-
Container
Layout
Manager2
1、标准AWT布局管理器
u BorderLayout
u FlowLayout
u CardLayout
u GridLayout
u GridBagLayout
Container默认布局管理器
BorderLyout
Frame
BorderLayout
Dialog
BorderLayout Window
FlowLayout
Panel &Applet
null
Container
默认的布局管理器容器类
两种类型的布局管理器u不带约束条件的布局管理器
LayoutManager
u带约束条件的布局管理器
LayoutManager2
2、布局管理器接口LayoutManager:
void addLayoutComponent(String name,Component comp);
void removeLayoutComponent(String name,Component comp);
Dimension preferredLayoutSize(Container parent);
Dimension minimumLayoutSize(Container parent);
void LayoutContainer(Container parent);
布局管理器接口
LayoutManager2:
void addLayoutComponnet(Componnet c, Object constraints);Dimension maximumLayoutSize(Container );
float getLayoutAlignmentx(Container parent);float getLayoutAlignmenty(Container parent);void invalidateLayout(Container parent);
标准AWT 布局管理器实现的接口
无
LayoutManager FlowLayout
无LayoutManager GridLayout 规定网格约束条件LayoutManager2GridBagLayout 字符串规定名字LayoutManager2CardLayout 字符串规定方位LayoutManager2BorderLayout 构件的约束条件
实现的接口布局管理器
3、布局管理器和构件的首选尺寸
//Component methods
public Dimension getPreferredSize (); public Dimension getMinimumSize ();
//LayoutManager methods
Dimension preferredLayoutSize(Container );Dimension minimumLayoutSize(Container );
布局管理器和首选尺寸
根据构件的GridBagConstraints 变化。
GridBagLayout
忽略首选高度和宽度。
GridLayout 忽略首选高度和宽度。CardLayout 如果构件没有被显式地设置大小,则保留首选高度和宽度。
FlowLayout NORTH & SOUTH:保留高度,忽略宽度EAST & WEST :保留宽度,忽略高度CENTER :忽略首选高度和宽度
BorderLayout
保留构件首选尺寸的策略
布局管理器
4、布局管理器和容器空白区
left
bottom right
top
容器构件class TenPixelBorder
extends Panel {
public TenPixelBorder(Component borderMe) {
setLayout(new BorderLayout());
add(borderMe, "Center");
}
public void paint(Graphics g) {
Dimension mySize=getSize();
Insets myInsets= getInsets();
g.setColor(Color.gray);
g.fillRect(0,0,mySize.width, myInsets.top);
g.fillRect(0,0,myInsets.left, mySize.height);
g.fillRect(mySize.width-myInsets.right, 0, myInsets.right,mySize.height);
g.fillRect(0, mySize.height-myInsets.bottom, mySize.width, mySize.height); }
public Insets getInsets() {
return new Insets(10,10,10,10);
}
}
4.3.2 标准AWT布局管理器
u BorderLayout u CardLayout
u FlowLayout
u GridLayout
u GridBagLayout
1、BorderLayout
public class BorderLayoutApplet extends Applet {
private Button north, south, east, west, center;
public void init() {
Panel buttonPanel = new Panel();
TenPixelBorder border = new TenPixelBorder(buttonPanel );
north = new Button("north ");east = new Button("east ");west = new Button("west ");center = new Button("center ");south = new Button("south ");
buttonPanel.setLayout(new BorderLayout(2,2));buttonPanel.add(north , "North");buttonPanel.add(south,"South ");buttonPanel.add(east , "East");buttonPanel.add(west , "West");buttonPanel.add(center,"Center ");setLayout(new BorderLayout ());add(border , "Center");
}
}
2、CardLayout
public class CardLayoutApplet extends Applet {private Button tiny, small, med, lrg ;private Panel cardPanel = new Panel(),
tinyPanel = new Panel(),smallPanel = new Panel(),MediumPanel = new Panel(),LargePanel = new Panel();private CardLayout card = new CardLayout(10,5);public void init(){……}
class ButtonListener implements ActionListener {public void actionPerformed(ActionEvent event){card.next(cardPanel );}}}
public void init(){
……
cardPanel.setLayout(card);
……
cardPanel.add(“tiny”,tinyPanel);
cardPanel.add(“small”,smallPanel);
cardPanel.add(“med”,MediumPanel);
cardPanel.add(“lrg”,LargePanel);
……
}
3、FlowLayout
public class FlowLayoutApplet extends Applet { public void init() {
Button one = new Button(" 1 "),
……
six = new Button(" 6 ");
Panel panel= new Panel();
TenPixelBorder border = new TenPixelBorder(panel);
panel.setLayout(new FlowLayout(FlowLayout.RIGHT, 10, 5));
panel.add(one);
……
panel.add(six);
setLayout(new BorderLayout());
add(border, "Center");
}
}
4 GridLayout