第 5 章 构成用户界面的窗口环境

94
1 第5第 第第第第第第第第第第第 第第第第第第第 第第第

Upload: valora

Post on 22-Jan-2016

127 views

Category:

Documents


0 download

DESCRIPTION

第 5 章 构成用户界面的窗口环境. 信息管理教研室 孙士兵. 构成用户界面的窗口环境. 5.1 使用 AWT(Abstract Window Toolkit) 构件 5.2 包含 构件的 构件---- 构件容器( container) 5.3 事件的传递 5.4 各种构件的应用实例 ( 一 ) 5.5 外观的管理与控制 5.6 各种构件的应用实例 ( 二 ) 5.7 总结. 5.1 使用 AWT 构件. 在 AWT 的概念中,窗口系统所显示的各种对象统称为构件: Button , Menu , List 等等都是构件。 - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 第 5 章  构成用户界面的窗口环境

1

第 5 章 构成用户界面的窗口环境

信息管理教研室 孙士兵

Page 2: 第 5 章  构成用户界面的窗口环境

2构成用户界面的窗口环境

5.1 使用 AWT(Abstract Window Toolkit) 构件 5.2 包含构件的构件 ----构件容器( container)

5.3 事件的传递 5.4 各种构件的应用实例 ( 一 )

5.5 外观的管理与控制 5.6 各种构件的应用实例 ( 二 )

5.7 总结

Page 3: 第 5 章  构成用户界面的窗口环境

35.1 使用 AWT 构件

在 AWT 的概念中,窗口系统所显示的各种对象统称为构件: Button , Menu , List 等等都是构件。

Component 是代表构件最基本的类。 Component类中定义了各种窗口对象中最基本、最重要的方法和性质。随时随处都有可能利用 Component定义的方法。

Page 4: 第 5 章  构成用户界面的窗口环境

45.1 使用 AWT 构件 已经学过的: getFont, handleEvent,keyUp keyDown,mouseUp, mouseDown, mouseMove, mouseEnter, mouseExit, mouseDrag, repaint setFont, resize

没有学过的: action, disable, enable, getBackground, getForeground, hide, inside, isEnable, isShowing, isVisible, locate, location, move, setBackground, setForeground, show, size

Page 5: 第 5 章  构成用户界面的窗口环境

5

列表 按钮 菜单

container

另一个窗口

窗口,对话框

5.2 包含构件的构件 ----构件容器(container)

container

Page 6: 第 5 章  构成用户界面的窗口环境

65.2 包含构件的构件 ----构件容器(container)import java.awt.*;

import java.applet.Applet;

public class CountClick extends Applet{ int CurrentMarks=0; public init() { Button b1=new Button(“按钮” ); add.b1; }}

按钮

Page 7: 第 5 章  构成用户界面的窗口环境

75.2 包含构件的构件 ----构件容器(container) AWT使用 Container类来定义最基本的构件容器 ,它有两个子类 :Window类和 Panel类 .

在Window 类还有两个子类 1. 定义对话框 ,用 Dialog子类 ;

Java 还提了一个 Dialog 的子类 ---FileDialog,

用它生成文件对话框 2. 定义一般意义的窗口 ,用 Frame类 .

Page 8: 第 5 章  构成用户界面的窗口环境

85.2 包含构件的构件 ----构件容器(container) Panel干什么用的呢 ?

使你更方便的组织你的构件 ,得到赏心悦目的布局

Applet 是 Panel 的子类 , 因此在小应用程序里可以直接加入构件 , 而一般的应用程序必须先定义构件容器 .

小应用程序在浏览器中所显示的区域就是 Pane

l, 所占的尺寸就是缺省得 Panel 尺寸 .

Page 9: 第 5 章  构成用户界面的窗口环境

9

Container

Window

Panel

Component

Frame

Dialog

FileDialog

Applet

5.2 包含构件的构件 ----构件容器(container)

Button

Menu

Checkbox

Textfield

Page 10: 第 5 章  构成用户界面的窗口环境

105.3 事件的传递 (1.02)当动作发生在按钮上时 ,

首先看按钮这个类有没有 action 方法 , 如果没有则看包含按钮的容器类 ( 即 panel) 有没有action 方法 , 如果没有事件就传递窗口 , 如果没有就传递给 compon

ent 的通用处理方法 ,

如果程序中没有定义任何 action 方法 , 实际上事件最终不被处理

窗口

按钮

panel

Page 11: 第 5 章  构成用户界面的窗口环境

11

class MyPanel extends Panel{ MyBtn b=new MyBtn(“ok”); add(b); boolean action() {…….;}}

class MyClass extends Frame{ MyPanel p=new Mypanel(); add(p); Button b=new Button(exit); add(b); boolean action() {…….;}}

窗口

exit

class MyBtn extends Button{ boolean action() { …….; return true;}}

ok

Panel

Page 12: 第 5 章  构成用户界面的窗口环境

125.3 事件的传递 (1.02)

事件由包含层次由内向外传递 . 每个处理事件的方法要有一个返回值 , 通知是

否继续向上传递 boolean action(Event evt, Object arg)

{ ……;

return true;

}

Page 13: 第 5 章  构成用户界面的窗口环境

135.3 事件的传递 (1.1)

窗口

button

panel

按钮的监听器

窗口获面板的监听器

Page 14: 第 5 章  构成用户界面的窗口环境

14

确定 取消

5.4 各种构件的应用实例 -- 按钮 Button 类 功能 : 创建按钮事件 创建一个 Button Button myButton = new Button(str); 将 button 放到窗口系统中 : add(new Button(“ 确定” ); add(new Button(“ 取消” ); Button 类的常用方法 getLabel setLabel

Page 15: 第 5 章  构成用户界面的窗口环境

15

action--- 接受动作事件 , 调用 repaint

init--- 建 立 button

paint--- 显示文字

5.4 各种构件的应用实例 -- 按钮

处理 button 产生的事件 例 : 创建一个按钮 , 每当按下它时 , 在屏幕显示

文字 (singlebutton.html) 想一想 : 应该有哪些类 ? Button ,Font; 应有哪些方法 ?

Page 16: 第 5 章  构成用户界面的窗口环境

16

import java.awt.*;import java.applet.Applet;

public class button extends Applet

{ Font font; Button b1;

public void init()

{ font=

newFont("TimesRoman",Font.BOLD,20);

b1=new Button("push");

add(b1); setFont(font);

}

5.4 各种构件的应用实例 -- 按钮

Page 17: 第 5 章  构成用户界面的窗口环境

175.4 各种构件的应用实例 -- 按钮

boolean action(Event evt,Object arg) { y+=5; repaint(); return true; } paint(Graphics g) { g.drawString("Button”, 10,y);}

Page 18: 第 5 章  构成用户界面的窗口环境

185.4 各种构件的应用实例 -- 按钮import java.awt.*;\\ 例 : 不在 applet 中的按钮class ButtoninFrame { public static void main(String args

[])

{ Frame myframe=new Frame();

myframe.setTitle("Button in Frame");

myframe.resize(200,200); myframe.show();

Button b1=new Button("Button1");

Button b2=new Button("Button2");

myframe.add(b1);myframe.add(b2);

}

}

.

Page 19: 第 5 章  构成用户界面的窗口环境

195.4 各种构件的应用实例 一般步骤 :

创建 new 加 入 add

响 应 action

处理

Page 20: 第 5 章  构成用户界面的窗口环境

205.4 各种构件的应用实例

Sports

Computer

Music

Art

Sports

Computer

Music

Art

min maxstart

1New Checkbox(label, null, false);CheckboxGroup gr=new CheckboxGroup(); New Checkbox(label, gr, false);New Checkbox(label,gr,true);

New TextField(20);常用的方法 getText();setText();setEchoCharacter(char c)

Scrollbar(VERTICAL,50,0,1,100);

new TextArea( “this is a test”,20,40);

Page 21: 第 5 章  构成用户界面的窗口环境

215.4 各种构件的应用实例 --CheckBox

应用举例 建立三个复选框 , 被选中者的标签内容变成“ c

hanges”– 应有的类 :Checkbox– 应有的方法 :– init: 建立复选框– action: 接受动作事件– setLabel(“*****”);

Page 22: 第 5 章  构成用户界面的窗口环境

225.4 各种构件的应用实例 --CheckBox

import java.awt.*;

public class checkbox extends java.applet.Applet

{ Checkbox b1,b2,b3;

public void init()

{ b1=new Checkbox("Label1",null,false);

b2=new Checkbox("Label2",null,false);

b3=new Checkbox("Label3",null,false);

add(b1); add(b2); add(b3);

}

Page 23: 第 5 章  构成用户界面的窗口环境

23

public boolean action(Event evt, Object arg){ if (evt.target instanceof Checkbox){ Checkbox selectedbox=(Checkbox)evt.target; String str=selectedbox.getLabel(); if (str=="Label1")

selectedbox.setLabel("Chnage1"); else if (str=="Label2")

selectedbox.setLabel("Chnage2"); else if (str=="Label3")

selctedbox.setLabel("Change3"); } repaint();return true;}

5.4 各种构件的应用实例 --- CheckBox

Page 24: 第 5 章  构成用户界面的窗口环境

24

例 : 在文本行中输入 , 并用字符串接受 , 显示出来

类的数据构成 :Textfield,Button, String 类的方法构成 : init(), action(): 接受按钮事件 , 调用 paint() paint(): 用 getText() 方法得到输入内容 , 并显

示 .

5.4 各种构件的应用实例 --- TextField

Page 25: 第 5 章  构成用户界面的窗口环境

25

import java.awt.*;

public class textfieldkey extends

java.applet.Applet

{ TextField t;String s;Button button;

public void init()

{ t=new TextField("",25); add(t);

button=new Button("getText"); add(button); }

5.4 各种构件的应用实例 --- TextField

Page 26: 第 5 章  构成用户界面的窗口环境

26

public boolean action(Event evt, Object arg){ if(evt.target instanceof Button) { repaint();} return true;} public void paint(Graphics g){ s=t.getText(); g.drawString(s,40,80); }

5.4 各种构件的应用实例 --- TextField

Page 27: 第 5 章  构成用户界面的窗口环境

27

0

1 2 43

5

4

0 1

5

3

4

5.5 外观的管理与制

Page 28: 第 5 章  构成用户界面的窗口环境

28

button1 button2

button4button3

5.5 外观的管理与制 Panel 类 ( 面板 ) 功能 : 容纳其他对象 , 安排合理布局 创建面板 : Panel myPanel=new Panel(); add(myPanel); 将面板作为容器 : mypanel.add(button)

Page 29: 第 5 章  构成用户界面的窗口环境

295.5 外观的管理与制 例 :(panel.htm)

import java.awt.*;public class Panel extends java.applet.Applet{ Panel panel1,panel2; Button button1,button2,button3,button4; public void init() { panel1=new Panel(); panel2=new Panel(); add(panel1); add(panel2); button1=new Button("Button1"); button2=new Button("Button2"); button3=new Button("Button3"); button4=new Button("Button4"); panel1.add(button1); panel1.add(button2); panel2.add(button3); panel2.add(button4); }}

Page 30: 第 5 章  构成用户界面的窗口环境

30

西 东

5.5 外观的管理与制 BorderLayout 类 功能 :Applet 分成五个区 创建 setLayout(new BorderLayout()); 将其他构件加入 add(“East”, new Button(“ 东” ); add(“South”, new Button(“ 南” ); add(“West”, new Button(“ 西” ); add(“North”, new Button(“ 北” ); add(“Center”, new Button(“ 中” );

Page 31: 第 5 章  构成用户界面的窗口环境

315.5 外观的管理与制 FlowLayout 类 缺省的输出管理器

GridLayout 类 GridLayout mylayout = new GridLayout(3,3,0,0)

setLayout();

rows cols hspace vspace

Page 32: 第 5 章  构成用户界面的窗口环境

325.5 外观的管理与制 GridBagLayout 类和 GridBagConstraints 类 功能 : 借助于 GridBagConstraints 类 , 实现更

灵活的外观管理 每个构件后都跟随一个 GridBagLayout 对象实

体 , 来决定构件的外观 . 创建 GridBagLayout myLayout=new GridBagLayout();

Page 33: 第 5 章  构成用户界面的窗口环境

335.5 外观的管理与制 GridBagConstraints 类的约束条件 gridwidth,

gridheight, gridx, gridy, weightx, weighty, ipadx, ipady, insets fill 及其设置 GridBagConstraints.NONE GridBagConstraints.HORIZONTAL GridBagConstraints.VERTICAL GridBagConstraints.BOTH GridBagConstraints.RELATIVE

Page 34: 第 5 章  构成用户界面的窗口环境

34

button1 button2 button3

button8

button5 button6

button7

button4

button9

5.5 外观的管理与制 例 :(GridBagApplet.html)

Page 35: 第 5 章  构成用户界面的窗口环境

355.5 外观的管理与制public void init() { GridBagLayout layout=new GridBagLayout(); setLayout(layout); GridBagConstraints GBC = new GridBagConstraints();

Button button1=new Button("button1");Button button2=new Button("button2");Button button3=new Button("button3");Button button4=new Button("button4");Button button5=new Button("button5");Button button6=new Button("button6");Button button7=new Button("button7");Button button8=new Button("button8");Button button9=new Button("button9");

Page 36: 第 5 章  构成用户界面的窗口环境

365.5 外观的管理与制GBC.fill=GridBagConstraints.BOTH;

( 按钮可以在水平和垂直两个方向扩展 )

layout.setConstraints(button1,GBC);

add(button1);

GBC.gridwidth=GridBagConstraints.RELATIVE;

(BOTH 依然起作用 , 紧挨着最后一个按钮 ,)

layout.setConstraints(button2,GBC);

add(button2);

GBC.gridwidth=GridBagConstraints.REMAINDER;

( 填充剩余部分 )

layout.setConstraints(button3,GBC);

add(button3); But1 But2 But3

Page 37: 第 5 章  构成用户界面的窗口环境

37

But1 But2 But3

But4

5.5 外观的管理与制 GBC.gridwidth= GridBagConstraint

s.REMAINDER; ( 表示该按钮独占一行 ) layout.setConstraints(button4,GBC); add(button4);

Page 38: 第 5 章  构成用户界面的窗口环境

38

But1 But2 But3

But4

But6But5

5.5 外观的管理与制 GBC.gridwidth=2; ( 表示该按钮占两个单元 ) layout.setConstraints(button5,GBC); add(button5);

GBC.gridwidth= GridBagConstraints.REMAINDER; layout.setConstraints(button6,GBC); add(button6);

Page 39: 第 5 章  构成用户界面的窗口环境

39

But1 But2 But3

But4

But6But5

But7

5.5 外观的管理与制 GBC.gridwidth=1; GBC.gridheight=2; (高度为两个单元 ) layout.setConstraints(button7,GBC); add(button7);

Page 40: 第 5 章  构成用户界面的窗口环境

40

But1 But2 But3

But4

But6But5

But7 But8

But9

5.5 外观的管理与制 GBC.gridwidth=

GridBagConstraints.REMAINDER; GBC.gridheight=1; layout.setConstraints(button8,GBC); add(button8); layout.setConstraints (button9,GBC); add(button9);

Page 41: 第 5 章  构成用户界面的窗口环境

415.6 各种构件的应用实例 ---Canvas

5.6.2 Canvas 类 (画布 ) 功能 : 制作其他构件 , 通常用来放置图形图像 ,或绘图 .

画图可以直接在 applet 区域上进行 , 定义了 Canvas 对象后将 paint()语句作为该对象的方法 ,这些动作就自动发生在画布区 .

通常不需要处理画布上发生的事件 创建 Canvas canvas=new Canvas(); add(canvas);

Page 42: 第 5 章  构成用户界面的窗口环境

425.6 各种构件的应用实例 ---Canvas

例 :根据程序说出运行结果 注意一个程序中生成一个 canvas 类的实例 , 另

一个程序没有

Page 43: 第 5 章  构成用户界面的窗口环境

435.6 各种构件的应用实例 ---Canvasimport java.awt.*; import java.applet.*;

public class canvas_test_2 extends Applet

{ public void init()

{ setLayout(new BorderLayout());

add("North", new Button("button1"));

add("South", new Button("button2"));

add("West", new Button("button3")); add("East", new Button("button4")); }

public void paint(Graphics g)

{ g.setColor(Color.red); g.fillRect(0,0,50,100);

g.setColor(Color.blue); g.fillRect(30,0,100,40);}

}

Page 44: 第 5 章  构成用户界面的窗口环境

445.6 各种构件的应用实例 ---Canvas

import java.awt.*; import java.applet.*;

public class canvas_test extends Applet

{ MyCanvas mycanvas=new MyCanvas();

public void init()

{ setLayout(new BorderLayout());

add("Center",mycanvas);

add("North",new Button("button1"));

….;

add("East",new Button("button4")); }

}

Page 45: 第 5 章  构成用户界面的窗口环境

455.6 各种构件的应用实例 ---Canvas

class MyCanvas extends Canvas

{ public void paint(Graphics g)

{ g.setColor(Color.red);

g.fillRect(0,0,50,100);

g.setColor(Color.blue);

g.fillRect(30,0,100,40);

}

}

Page 46: 第 5 章  构成用户界面的窗口环境

465.6 各种构件的应用实例 ---Canvas

Page 47: 第 5 章  构成用户界面的窗口环境

47

利用输出管理器按钮和画布

按钮接收鼠标事件 变换颜色 执行重画

color color color

5.6 各种构件的应用实例 ---Canvas 例 : 按动鼠标改变画布的颜色 (CanvasApplet) 有哪些类 ? Canvas, Button, Color; 哪些方法 ? init(), action(),swapColor(),paint()

Page 48: 第 5 章  构成用户界面的窗口环境

48

class CanvasApplet extends Applet

{ MyCanvas mycanvas=new MyCanvas();

public void init()

{ setLayout(new BorderLayout());

Button button = new Button("Color");

add("North",button);

add(“Center”,mycanvas);

resize(200,250);

}

5.6 各种构件的应用实例 ---Canvas

.

Page 49: 第 5 章  构成用户界面的窗口环境

495.6 各种构件的应用实例 ---Canvas

boolean action(Event evt, Object arg) { if(arg=="Color") mycanvas.swapColor(); return true; }

Page 50: 第 5 章  构成用户界面的窗口环境

505.6 各种构件的应用实例 ---Canvasclass MyCanvas extends Canvas

{ Color color; MyCanvas() { color=Color.red; } public void paint(Graphics g) { g.setColor(color); g.fillRect(20,20,100,100); g.setColor(color.white); g.drawString("CANVAS",40,40);} public void swapColor() { if(color==Color.black) color=Color.red; else if(color==Color.red) color=Color.green;

else color=Color.black; repaint(); }} .

Page 51: 第 5 章  构成用户界面的窗口环境

515.6 各种构件的应用实例 ---Frame

5.6.3 Frame 类 功能 : 制作一般的独立窗口 , 它是构件容器 创建 Frame fmInstance=new Frame(); 或 Frame fmInstance= new Frame(“The window for test”); 将其显示到屏幕上 fmInstance.show() 注意 : 不用 add()

Page 52: 第 5 章  构成用户界面的窗口环境

525.6 各种构件的应用实例 ---Frame

常用的方法 dispose,getCursorType,getIconImage, getMenuBar,getTitle,isResizable, setCursor,setIconImage,setMenuBar, setResizable,setTitle 窗口的相关事件 : Event.WINDOW_DEICONIFY, _DESTROY _EXPOSE, _ICONIFY, _MOVED

Page 53: 第 5 章  构成用户界面的窗口环境

535.6 各种构件的应用实例 ---Frame 例 : 创建一个窗口 , 并用按钮控制它的显示或 隐藏 FrameApplet

Frame Window

This is CustomFrame window

Show windowShow windowhide windowhide windowShow windowShow window

Page 54: 第 5 章  构成用户界面的窗口环境

545.6 各种构件的应用实例 ---Frame

在 applet 中 action 处理 Button 的事件

action 捕获 button

Frame.show

Frame.hide

button.label is show

button.label is hide

Page 55: 第 5 章  构成用户界面的窗口环境

555.6 各种构件的应用实例 ---Frame

. Frame Window

This is CustomFrame window

为了将字符显示在自定义窗口中 ,包含输出语句的方法必须在自定义的窗口类中

关闭窗口的事件在窗口类本身处理 .注 : 处理窗口中的事件用 handelEvent()public boolean handleEvent(Event evt) { switch(evt.id) { case Event.WINDOW_DESTROY:

dispose();System.exit(0);default: return super.handleEvent(evt); }

}

关闭窗口的事件在窗口类本身处理 .注 : 处理窗口中的事件用 handelEvent()public boolean handleEvent(Event evt) { switch(evt.id) { case Event.WINDOW_DESTROY:

dispose();System.exit(0);default: return super.handleEvent(evt); }

}

Page 56: 第 5 章  构成用户界面的窗口环境

565.6 各种构件的应用实例 ---Framepublic class FrameApplet extends Applet{ CustomFrame frame; Button button; public void init() { frame=new CustomFrame ("Custom Frame Window"); button=new Button("Show Window"); add(button); } } public boolean action(Event evt, Object arg) { boolean visible=frame.isShowing(); if(visible){ frame.hide(); button.setLabel("Show window");} else {frame.show();button.setLabel("Hide Window"); return true; }}

Page 57: 第 5 章  构成用户界面的窗口环境

575.6 各种构件的应用实例 ---Frameclass CustomFrame extends Frame{ CustomFrame(String title) { super(title);} public boolean handleEvent(Event evt) { switch(evt.id) { case Event.WINDOW_DESTROY:

dispose();System.exit(0);default: return super.handleEvent(evt); }

}

public void paint(Graphics g) { resize(200,100); g.drawString("this is a custom window.",30,30); }}

Page 58: 第 5 章  构成用户界面的窗口环境

58

button2

button1

Button1 10button2 1

button2

button1

Button1 0button2 7

5.6 各种构件的应用实例 ---Frame

多窗口 (FrameApplet\ButtonsFrames.class-f1.bat)

Page 59: 第 5 章  构成用户界面的窗口环境

595.6 各种构件的应用实例 ---Frame

1. 一个窗口类创建两个实例2. 由于有不同的事件发生 ( 按钮 ,关窗口 ), 因此事件先由

通用事件处理程序来接收 , 然后再根据情况做相应的处理 .

switch(evt.id)

{ case Event.WINDOW_DESTROY:

dispose(); return true;

case Event.ACTION_EVENT:

return action(evt, evt.arg);

default: return super.handleEvent(evt);}

}

Page 60: 第 5 章  构成用户界面的窗口环境

605.6 各种构件的应用实例 ---Frame

3. 任何时候只有一个窗口是活动的 (active) 的因此不必考虑那个判断是哪一个窗口发生的事件

4. 一般的结构 在 main() 中 ,只做与窗口有关的事情 : 创建窗

口 , 显示窗口 在构造方法中 , 安排窗口中的构件

Page 61: 第 5 章  构成用户界面的窗口环境

615.6 各种构件的应用实例 ---Frameimport java.awt.*;class ButtonsInFrames extends Frame{ int a1=0,a2=0;

public static void main(String args[]){ ButtonsInFrames myframe1=new

ButtonsInFrames(); myframe1.setTitle("Button in Frame1"); myframe1.resize(200,200); myframe1.show(); ButtonsInFrames myframe2=new

ButtonsInFrames(); myframe2.setTitle("Button in Frame2"); myframe2.resize(200,200); myframe2.show(); }

Page 62: 第 5 章  构成用户界面的窗口环境

625.6 各种构件的应用实例 ---FrameButtonsInFrames(){ setLayout(new BorderLayout()); Button b1=new Button("Button1"); Button b2=new Button("Button2"); add("North",b1);add("South",b2);}public boolean handleEvent(Event evt){ switch(evt.id) { case Event.WINDOW_DESTROY: dispose(); return true;

case Event.ACTION_EVENT: return action(evt, evt.arg);

default: return super.handleEvent(evt);}}

Page 63: 第 5 章  构成用户界面的窗口环境

635.6 各种构件的应用实例 ---Frame

public boolean action(Event evt, Object arg) { if(evt.target instanceof Button) if(arg=="Button1") a1++; else a2++; repaint(); return true; } public void paint(Graphics g) { g.drawString("button1 "+a1,5,80); g.drawString("button2 "+a2,5,100); }} .

Page 64: 第 5 章  构成用户界面的窗口环境

64

FontDisplayerFontDisplay!You can input something here.

ArialCourier NewTimes New Roman

1820222426

Courier New

22

5.6 各种构件的应用实例 ---练习与 List 类有关的事件Event.LIST_DESELECT,

Event.LIST_SELECT

例 :(FontDisplay.class---f3.bat)

public boolean handleEvent(Event evt){ switch(evt.id){ case Event.WINDOW_DESTROY: dispose(); System.exit(0); default: return super.handleEvent(evt); }}

public boolean handleEvent(Event evt){ switch(evt.id){ case Event.WINDOW_DESTROY: dispose(); System.exit(0); default: return super.handleEvent(evt); }}

.handleEventWINDOW_DESTROY

handleEventLIST_SELECT

add

Frame 类

Panel 类 TextArea 类

List List

add add

add

arae

area.setfont( 字型 , 字体 , 字号 )

Page 65: 第 5 章  构成用户界面的窗口环境

655.6 各种构件的应用实例 ---练习import java.awt.*;

class FontDisplay extends Frame

{ TextArea FontShower;

public static void main(String args[])

{ FontDisplay myFrame=new FontDisplay();

myFrame.setTitle("FontDisplayer");

myFrame.resize(450,300);

myFrame.show(); }

public FontDisplay()

{ setLayout(new BorderLayout(5,5));

FontShower=new TextArea("Font Display! ”);

add("West", new FontPanel(FontShower));

add("Center",FontShower);}

Page 66: 第 5 章  构成用户界面的窗口环境

66

对窗口来说只有一个事件

5.6 各种构件的应用实例 ---练习

public boolean handleEvent(Event evt)

{ switch(evt.id){

case Event.WINDOW_DESTROY:

dispose(); System.exit(0);

default: return super.handleEvent(evt);

}

}

Page 67: 第 5 章  构成用户界面的窗口环境

67

对右边的文本区设置属性 ,利用引用传递 .

得到列表选项用 getItem事件处理用用 handleEvent, 得到两个参数 -- 字型 ,字号 .

5.6 各种构件的应用实例 ---练习

在 panel 中创建两个列表往列表中加入条目用 additem(str)

.

void updateFontShower(){ area.setFont(new Font(CurrentFontName, Font.PLAIN, CurrentSize));}}

void updateFontShower(){ area.setFont(new Font(CurrentFontName, Font.PLAIN, CurrentSize));}}

Page 68: 第 5 章  构成用户界面的窗口环境

685.6 各种构件的应用实例 ---练习 public boolean handleEvent(Event evt) { switch(evt.id){ case Event.LIST_SELECT: List target=(List)evt.target; String itemName= target.getItem(((Integer)evt.arg).intValue

()); if(target==FontSelector) CurrentFontName=itemName; else CurrentSize=Integer.parseInt(itemNam

e);

Page 69: 第 5 章  构成用户界面的窗口环境

695.6 各种构件的应用实例 ---练习 String FontNames[]={"Arial", "Courier New",

"Times New Roman"}; List FontSelector=new List(); for (i=0;i<FontNames.length;i++) FontSelector.addItem(FontNames[i]); add(FontSelector); List SizeSelector=new List(); for (i=6;i<64;i+=2) SizeSelector.addItem(String.valueOf(i)); add(SizeSelector);

Page 70: 第 5 章  构成用户界面的窗口环境

70

updateFontShower(){ area.setFont(param1,param2,param3)

5.6 各种构件的应用实例 ---练习

class FontPanel extends Panel

{ int CurrentSize=20;

String CurrentFontName;

TextArea area;;

List FontSelector,SizeSelector;

Page 71: 第 5 章  构成用户界面的窗口环境

715.6 各种构件的应用实例 ---练习FontPanel(TextArea FS) //把另一个对象做参数{ int i; String FontNames[]={"Arial", "Courier New",

"Times New Roman"};

setLayout(new GridLayout(2,1,5,5));

FontSelector=new List();

for (i=0;i<FontNames.length;i++)

FontSelector.addItem(FontNames[i]);

add(FontSelector); SizeSelector=new List();

for (i=6;i<64;i+=2)

SizeSelector.addItem(String.valueOf(i));

add(SizeSelector); area=FS; CurrentFontName=FontNames[0];

updateFontShower(); }

Page 72: 第 5 章  构成用户界面的窗口环境

725.6 各种构件的应用实例 ---练习public boolean handleEvent(Event evt){ switch(evt.id){ case Event.LIST_SELECT: List target=(List)evt.target; String itemName= target.getItem(((Integer)evt.arg).intValue()); if(target==FontSelector) CurrentFontName=itemName; else CurrentSize=Integer.parseInt(itemName); updateFontShower(); return true; default: return super.handleEvent(evt); }} void updateFontShower(){ area.setFont(new Font(CurrentFontName, Font.PLAIN, CurrentSize));}}

Page 73: 第 5 章  构成用户界面的窗口环境

73

菜单系统一般菜单 可撕下菜单 帮助菜单

类 MenuBar

选项 #1

菜单中的菜单

选项 #3

选项 #4

选项 #1

选项 #2

第三层菜单

选项 #3

选项 #1

选项 #2

类Menu

类 MenuItem

5.6 各种构件的应用实例 ---menu

5.6.6 菜单系统

选项 #2菜单容器

非菜单容器

Page 74: 第 5 章  构成用户界面的窗口环境

745.6 各种构件的应用实例 ---menu

创建菜单条 mb=new MenuBar(); setMenuBar(mb);( 类 Frame 中的方法 )

创建菜单 menu1=new Menu(“file”); menu2=new Menu(“edit) mb.add(menu1);mb.add(menu2);

editfile

Page 75: 第 5 章  构成用户界面的窗口环境

755.6 各种构件的应用实例 ---menu

创建菜单项 mi1=new MenuItem(“new”); mi2=new MenuItem(“open”); mi3=new MenuItem(“save”); mi4=new MenuItem(“close”); menu1.add(mi1); menu1.add(mi2);

editFile

New

open

Save

Close

Page 76: 第 5 章  构成用户界面的窗口环境

765.6 各种构件的应用实例 ---menu如何处理事件public boolean action(Event e, Object arg)

{ if (e.target instanceof MenuItem)

{ MenuItem selected=(MenuItem)e.trget;

tring s=selected.getLabel();

switch(s)

{ case “new”: ….;

case “open”: ….;

case “save”: ….;

case “close”: ….; } }}

Page 77: 第 5 章  构成用户界面的窗口环境

775.6 各种构件的应用实例 ---menu

在处理菜单事件 时应该注意的事情是 :判断层次

MenuContainer uplevel;( 定义一个菜单容器 ) MenuItem target=(MenuItem)evt.target;( 当前

被选中的对象 ) uplevel=target.getParent(); strMessage=uplevel.getLabel()( 得到上一级容

器的标签 )

A

A

Page 78: 第 5 章  构成用户界面的窗口环境

785.6 各种构件的应用实例 ---menupublic boolean action(Event evt, Object arg)

{ String strMessage;

if(evt.target instanceof MenuItem){

MenuItem target=(MenuItem)evt.target;

MenuContainer uplevel;

uplevel=target.getParent();

while(uplevel instanceof Menu) {

strMessage=((Menu)uplevel).getLabel()+strMessage;

uplevel=((Menu)uplevel).getParent(); }

strMessage="you selected"+strMessage;

taMessage.appendText(strMessage);

return true; } else return false;}

Page 79: 第 5 章  构成用户界面的窗口环境

795.6 各种构件的应用实例 ---menu

Java1.1 处理菜单的方法 两个主要的策略 : 1. 让每个菜单项有一个唯一的监听器 2. 将一个大的监听器用于用于所有菜单项

Page 80: 第 5 章  构成用户界面的窗口环境

805.6 各种构件的应用实例 ---menu

class Example

{ class MenuFileOpen implements ActionListener

{ public void actionPerformed(ActionEvent e)

{ openFile(e.getActionCommand());}

}

class MenuFileSave implements ActionListener

{ public void actionPerformed(ActionEvent e)

{ saveFile(e.getActionCommand());}

}

Page 81: 第 5 章  构成用户界面的窗口环境

815.6 各种构件的应用实例 ---menu

public void init()

{ MenuItem OpenItem=new

MenuItem(“Open…”);

OpenItem.addActionListener

(new MenuFileOpen());

MenuItem SaveItem=

new MenuItem(“Save…”);

SaveItem.addActionListener

(new MenuFileSave());

}

Page 82: 第 5 章  构成用户界面的窗口环境

825.6 各种构件的应用实例 --综合练习 设计用户界面可根据用户选择办理银行业务 Bankapp\Bankapp.class---f2.bat 控制流程

Page 83: 第 5 章  构成用户界面的窗口环境

835.6 各种构件的应用实例 --综合练习 class Bank { long balance; public Bank() { balance=50; } public void deposite(long amount) { if(amount>0.0) {balance+=amount;}} void withdrawal(long amount) { if(amount>0.0 &&amount <= balance) { balance-=amount;} } public long show_balance() { return (long)balance; } }

Page 84: 第 5 章  构成用户界面的窗口环境

84

public class BankDemo

{ public static void main(String agrs[])

{

Bank account1=new Bank();

Bank account2=new Bank();

account1.deposite(100);

account2.withdrawal(50);

account1.show_balance();

account2.show_balance();}

}

5.6 各种构件的应用实例 --综合练习

Page 85: 第 5 章  构成用户界面的窗口环境

855.6 各种构件的应用实例 --综合练习

WelCome to Bank

100

Show nbalance

Create account

Deposit

Withdrawal

Page 86: 第 5 章  构成用户界面的窗口环境

86

主类 Bankapp(Frame 的子类 )

辅类 Bank

Bank() 创建账户

show_balance

diposite()

withdrawal()

main()定义并显示窗口

Bankapp()布局安排

handleEvent()关闭窗口

action()根据按钮做处理

辅类 Warningbox

Warningbox(String str)布局安排 , 显示对话框显示警告信息

action()关闭对话框它是模态的

不满足 Bank 要求

满足 Bank 要求

5.6 各种构件的应用实例 --综合练习

Page 87: 第 5 章  构成用户界面的窗口环境

875.6 各种构件的应用实例 --综合练习

public static void main(String args[]){ Bankapp frame=new Bankapp(); frame.setTitle("Bank Application"); frame.resize(200,200); frame.show(); }

public static void main(String args[]){ Bankapp frame=new Bankapp(); frame.setTitle("Bank Application"); frame.resize(200,200); frame.show(); }

Page 88: 第 5 章  构成用户界面的窗口环境

885.6 各种构件的应用实例 --综合练习public Bankapp()

{setLayout(new GridLayout(6,1));

Label lb=new

Label("welcome to Bank",Label.CENTER);

tf=new TextField("0",15); add(lb);add(tf);

b1=new Button("create account"); add(b1);

b2=new Button("show balance"); add(b2);

b3=new Button("diposite"); add(b3);

b4=new Button("withdrawal"); add(b4);

resize(450,100);

}

public Bankapp()

{setLayout(new GridLayout(6,1));

Label lb=new

Label("welcome to Bank",Label.CENTER);

tf=new TextField("0",15); add(lb);add(tf);

b1=new Button("create account"); add(b1);

b2=new Button("show balance"); add(b2);

b3=new Button("diposite"); add(b3);

b4=new Button("withdrawal"); add(b4);

resize(450,100);

}

Page 89: 第 5 章  构成用户界面的窗口环境

89

public boolean handleEvent(Event evt){ switch(evt.id) { case Event.WINDOW_DESTROY: dispose(); System.exit(0); return true; case Event.ACTION_EVENT:

return action(evt, evt.arg); default:

return super.handleEvent(evt); }}

public boolean handleEvent(Event evt){ switch(evt.id) { case Event.WINDOW_DESTROY: dispose(); System.exit(0); return true; case Event.ACTION_EVENT:

return action(evt, evt.arg); default:

return super.handleEvent(evt); }}

5.6 各种构件的应用实例 --综合练习

Page 90: 第 5 章  构成用户界面的窗口环境

905.6 各种构件的应用实例 --综合练习public boolean action(Event evt,Object arg){if(evt.target instanceof Button) { String targetLabel=tf.getText(); long amount=Long.valueOf(targetLabel).longValue(); if (arg=="diposite") { if (!haveAccount) {wb=new WarningBox(this,"create a account first!"); wb.show(); } else { if(amount==0)

{ wb=new WarningBox(this,”need the amount"); wb.show(); } else { bank.deposite(amount); tf.setText("0"); }}

return true; } return false;}

Page 91: 第 5 章  构成用户界面的窗口环境

915.6 各种构件的应用实例 --综合练习public WarningBox(Frame parent,String str){ super(parent,"Warning!",true); Panel panel=new Panel(); panel.setLayout(new GridLayout(2,1)); panel.add(new Label(str,Label.CENTER)); panel.add(new Button("OK")); add(info_panel);}public boolean action(Event evt,Object arg){ if (evt.target instanceof Button) { this.dispose(); return true; } return false;}

Page 92: 第 5 章  构成用户界面的窗口环境

925.6 各种构件的应用实例 --综合练习class Bank{ long balance; public Bank() { balance=50; }

public void deposite(long amount) { if(amount>0.0) {balance+=amount;}} void withdrawal(long amount) { if(amount>0.0 &&amount <= balance) { balance-=amount;} }

public long show_balance() { return (long)balance; } }

Page 93: 第 5 章  构成用户界面的窗口环境

93

了解类及其常用方法

创建类的实例new

设计好容器层次

创建输出管理器 setLayout

加到上一级容器中 add

定义事件的处理action

5.7 总结 5.8 总结 1 使用 AWT 构件的应用实例 2 事件的传递 3 外观的管理与控制

Page 94: 第 5 章  构成用户界面的窗口环境

94作业 将文本行的输入加入到文本域中

追加