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

Post on 22-Jan-2016

127 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

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

1

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

信息管理教研室 孙士兵

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

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

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

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

5.7 总结

35.1 使用 AWT 构件

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

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

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

5

列表 按钮 菜单

container

另一个窗口

窗口,对话框

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

container

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; }}

按钮

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

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

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

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

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

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

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

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

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

9

Container

Window

Panel

Component

Frame

Dialog

FileDialog

Applet

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

Button

Menu

Checkbox

Textfield

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

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

ent 的通用处理方法 ,

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

窗口

按钮

panel

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

125.3 事件的传递 (1.02)

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

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

{ ……;

return true;

}

135.3 事件的传递 (1.1)

窗口

button

panel

按钮的监听器

窗口获面板的监听器

14

确定 取消

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

15

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

init--- 建 立 button

paint--- 显示文字

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

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

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

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 各种构件的应用实例 -- 按钮

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

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

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);

}

}

.

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

创建 new 加 入 add

响 应 action

处理

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);

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

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

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

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);

}

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

24

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

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

示 .

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

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

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

27

0

1 2 43

5

4

0 1

5

3

4

5.5 外观的管理与制

28

button1 button2

button4button3

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

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); }}

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(“ 中” );

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

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

setLayout();

rows cols hspace vspace

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

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

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

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

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

34

button1 button2 button3

button8

button5 button6

button7

button4

button9

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

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");

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

37

But1 But2 But3

But4

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

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

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);

39

But1 But2 But3

But4

But6But5

But7

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

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);

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

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

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

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

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

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

一个程序没有

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);}

}

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")); }

}

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);

}

}

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

47

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

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

color color color

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

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

.

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

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

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(); }} .

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

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

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

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

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

Frame Window

This is CustomFrame window

Show windowShow windowhide windowhide windowShow windowShow window

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

在 applet 中 action 处理 Button 的事件

action 捕获 button

Frame.show

Frame.hide

button.label is show

button.label is hide

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); }

}

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; }}

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); }}

58

button2

button1

Button1 10button2 1

button2

button1

Button1 0button2 7

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

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

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);}

}

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

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

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

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

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(); }

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);}}

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); }} .

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( 字型 , 字体 , 字号 )

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);}

66

对窗口来说只有一个事件

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

public boolean handleEvent(Event evt)

{ switch(evt.id){

case Event.WINDOW_DESTROY:

dispose(); System.exit(0);

default: return super.handleEvent(evt);

}

}

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));}}

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);

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);

70

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

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

class FontPanel extends Panel

{ int CurrentSize=20;

String CurrentFontName;

TextArea area;;

List FontSelector,SizeSelector;

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(); }

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));}}

73

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

类 MenuBar

选项 #1

菜单中的菜单

选项 #3

选项 #4

选项 #1

选项 #2

第三层菜单

选项 #3

选项 #1

选项 #2

类Menu

类 MenuItem

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

5.6.6 菜单系统

选项 #2菜单容器

非菜单容器

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

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

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

editfile

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

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”: ….; } }}

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

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

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

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

器的标签 )

A

A

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;}

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

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

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());}

}

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

public void init()

{ MenuItem OpenItem=new

MenuItem(“Open…”);

OpenItem.addActionListener

(new MenuFileOpen());

MenuItem SaveItem=

new MenuItem(“Save…”);

SaveItem.addActionListener

(new MenuFileSave());

}

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

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; } }

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 各种构件的应用实例 --综合练习

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

WelCome to Bank

100

Show nbalance

Create account

Deposit

Withdrawal

86

主类 Bankapp(Frame 的子类 )

辅类 Bank

Bank() 创建账户

show_balance

diposite()

withdrawal()

main()定义并显示窗口

Bankapp()布局安排

handleEvent()关闭窗口

action()根据按钮做处理

辅类 Warningbox

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

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

不满足 Bank 要求

满足 Bank 要求

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

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(); }

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);

}

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 各种构件的应用实例 --综合练习

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;}

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;}

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; } }

93

了解类及其常用方法

创建类的实例new

设计好容器层次

创建输出管理器 setLayout

加到上一级容器中 add

定义事件的处理action

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

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

追加

top related