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的子类,因此在小应用程序里可以直接加入构件,而一般的应用程序必须先定义构件容器,
小应用程序在浏览器中所显示的区域就是
Panel,所占的尺寸就是缺省得 Panel尺寸,
9
Container
Window
Panel
Component
Frame
Dialog
FileDialog
Applet
5.2 包含 构件的 构件 ----构件容器 (container)
Button
Menu
Checkbox
Textfield
105.3 事件的传递 (1.02)
当动作发生在按钮上时,
首先看按钮这个类有没有 action方法,如果没有则看包含按钮的容器类
(即 panel)有没有 action
方法,如果没有事件就传递窗口,如果没有就传递给 component的通用处理方法,如果程序中没有定义任何 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
应用举例
建立三个复选框,被选中者的标签内容变成
,changes”
– 应有的类,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=
GridBagConstraints.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 各种构件的应用实例 ---Canvas
import 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 各种构件的应用实例 ---Canvas
class 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 windowhide 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); }
}
565.6 各种构件的应用实例 ---Frame
public 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 各种构件的应用实例 ---Frame
class 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 10
button2 1
button2
button1
Button1 0
button2 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 各种构件的应用实例 ---Frame
ButtonsInFrames()
{ 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
FontDisplayer
FontDisplay!
You can input
something here.
Arial
Courier New
Times New Roman
18
20
22
24
26
ourier 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);
}
}
.handleEvent
WINDOW_DESTROY
handleEvent
LIST_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));}}
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(itemName);
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 各种构件的应用实例 ---menu
public 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(); }
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);
}
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);
}
}
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作业
将文本行的输入加入到文本域中追加
第 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的子类,因此在小应用程序里可以直接加入构件,而一般的应用程序必须先定义构件容器,
小应用程序在浏览器中所显示的区域就是
Panel,所占的尺寸就是缺省得 Panel尺寸,
9
Container
Window
Panel
Component
Frame
Dialog
FileDialog
Applet
5.2 包含 构件的 构件 ----构件容器 (container)
Button
Menu
Checkbox
Textfield
105.3 事件的传递 (1.02)
当动作发生在按钮上时,
首先看按钮这个类有没有 action方法,如果没有则看包含按钮的容器类
(即 panel)有没有 action
方法,如果没有事件就传递窗口,如果没有就传递给 component的通用处理方法,如果程序中没有定义任何 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
应用举例
建立三个复选框,被选中者的标签内容变成
,changes”
– 应有的类,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=
GridBagConstraints.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 各种构件的应用实例 ---Canvas
import 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 各种构件的应用实例 ---Canvas
class 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 windowhide 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); }
}
565.6 各种构件的应用实例 ---Frame
public 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 各种构件的应用实例 ---Frame
class 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 10
button2 1
button2
button1
Button1 0
button2 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 各种构件的应用实例 ---Frame
ButtonsInFrames()
{ 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
FontDisplayer
FontDisplay!
You can input
something here.
Arial
Courier New
Times New Roman
18
20
22
24
26
ourier 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);
}
}
.handleEvent
WINDOW_DESTROY
handleEvent
LIST_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));}}
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(itemName);
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 各种构件的应用实例 ---menu
public 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(); }
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);
}
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);
}
}
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作业
将文本行的输入加入到文本域中追加