分享
 
 
 

AWT GUI 设计笔记(二)

王朝java/jsp·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

.....

接上篇

4.3:EventAdapter----事件适配器

Java语言为一些Listener接口提供了适配器(Adapter)类。可以通过继承事件所对应的Adapter类,重写需要方法,无关方法不用实现。事件适配器为我们提供了一种简单的实现监听器的手段, 可以缩短程序代码。但是,由于java的单一继承机制,当需要多种监听器或此类已有父类时,就无法采用事件适配器了。

1.事件适配器--EventAdapter

2. 用内部类实现事件处理

3.匿名类(Anonymous Class)

下例中采用了鼠标适配器:

import java.awt.*;

import java.awt.event.*;

public class MouseClickHandler extends MouseAdaper{

public void mouseClicked(MouseEvent e) //只实现需要的方法

{ ……}

}

java.awt.event包中定义的事件适配器类包括以下几个:

1.ComponentAdapter( 组件适配器)

2.ContainerAdapter( 容器适配器)

3.FocusAdapter( 焦点适配器)

4.KeyAdapter( 键盘适配器)

5.MouseAdapter( 鼠标适配器)

6.MouseMotionAdapter( 鼠标运动适配器)

7.WindowAdapter( 窗口适配器)

用内部类实现事件处理

内部类(inner class)是被定义于另一个类中的类,使用内部类的主要原因是由于:

◇ 一个内部类的对象可访问外部类的成员方法和变量,包括私有的成员。

◇ 实现事件监听器时,采用内部类、匿名类编程非常容易实现其功能。

◇ 编写事件驱动程序,内部类很方便。

因此内部类所能够应用的地方往往是在AWT的事件处理机制中。

import java.awt.* ;

import java.awt.event.*;

public class InnerClass{

private Frame f;

private TextField tf;

public InnerClass(){

f=new Frame("Inner classes example");

tf=new TextField(30);

}

public voidi launchFrame(){

Label label=new Label("Click and drag the mouse");

f.add(label,BorderLayout.NORTH);

f.add(tf,BorderLayout.SOUTH);

f.addMouseMotionListener(new MyMouseMotionListener());/*参数为内部类对象*/

f.setSize(300,200);

f.setVisible(true);

}

class MyMouseMotionListener extends MouseMotionAdapter{ /*内部类开始*/

public void mouseDragged(MouseEvent e) {

String s="Mouse dragging: x="+e.getX()+"Y="+e.getY();

tf.setText(s); }

} ;

public static void main(String args[]) {

InnerClass obj=new InnerClass();

obj.launchFrame();

}

}//内部类结束

}

匿名类(Anonymous Class)

当一个内部类的类声名只是在创建此类对象时用了一次,而且要产生的新类需继承于一个已有的父类或实现一个接口,才能考虑用匿名类,由于匿名类本身无名,因此它也就不存在构造方法,它需要显示地调用一个无参的父类的构造方法,并且重写父类的方法。所谓的匿名就是该类连名字都没有,只是显示地调用一个无参的父类的构造方法。

import java.awt.* ;

import java.awt.event.*;

public class AnonymousClass{

private Frame f;

private TextField tf;

public AnonymousClass(){

f=new Frame("Inner classes example");

tf=new TextField(30);

}

public void launchFrame(){

Label label=new Label("Click and drag the mouse");

f.add(label,BorderLayout.NORTH);

f.add(tf,BorderLayout.SOUTH);

f.addMouseMotionListener(new MouseMotionAdapter(){ //匿名类开始

public void mouseDragged(MouseEvent e){

String s="Mouse dragging: x="+e.getX()+"Y="+e.getY();

tf.setText(s); }

} ); //匿名类结束

f.setSize(300,200);

f.setVisible(true);

}

public static void main(String args[]) {

AnonymousClass obj=new AnonymousClass();

obj.launchFrame();

}

}

五.组件库

5.1.按钮(Button)

按钮是最常用的一个组件,其构造方法是:Button b = new Button("Quit");

当按钮被点击后,会产生ActionEvent事件,需ActionListener接口进行监听和处理事件。

ActionEvent的对象调用getActionCommand()方法可以得到按钮的标识名,缺省按钮名为label。

用setActionCommand()可以为按钮设置组件标识符。

5.2.复选框 (Checkbox)

构造方法如下:

setLayout(new GridLayout(3,1));

add(new Checkbox("one",null,true));

add(new Checkbox("two"));

add(new Checkbox("three"));

复选框用ItemListener 来监听ItemEvent事件,当复选框状态改变时用getStateChange()获取当前状态。使用getItem()获得被修改复选框的字符串对象。

5.3复选框组(CheckboxGroup)

使用复选框组,可以实现单选框的功能。方法如下:

setLayout(new GridLayout(3, 1));

CheckboxGroup cbg = new CheckboxGroup();

add(new Checkbox("one", cbg, true));

add(new Checkbox("two", cbg, false));

add(new Checkbox("three", cbg, false));

5.4.下拉式菜单(Choice)

下拉式菜单每次只能选择其中的一项,它能够节省显示空间,适用于大量选项。

Choice Colorchooser=new Choice();

Colorchooser.add("Green");

Colorchooser.add("Red");

Colorchooser.add("Blue");

Choice 用ItemListener接口来进行监听

5.5. Canvas

一个应用程序必须继承Canvas类才能获得有用的功能,比如创建一个自定义组件。如果想在画布上完成一些图形处理,则Canvas类中的paint()方法必须被重写。

Canvas组件监听各种鼠标,键盘事件。当在Canvas组件中输入字符时,必须先调用requestFocus()方法。

5.6.单行文本输入区(TextField)

只能显示一行,当回车键被按下时,会发生ActionEvent事件,可以通过ActionListener中的actionPerformed()方法对事件进行相应处理。可以使用setEditable(boolean)方法设置为只读属性。

单行文本输入区构造方法如下:

TextField tf1,tf2,tf3,tf4:

tf1=new TextField();

tf2=new TextField("",20); //显示区域为20列

tf3=new TextField("Hello!"); //按文本区域大小显示

tf4=new TextField("Hello!",30); //初始文本为Hello!, 显示区域为30列

7. 文本输入区(TextArea)

TextArea可以显示多行多列的文本。使用setEditable(boolean)方法,可以将其设置为只读的。在TextArea中可以显示水平或垂直的滚动条。

要判断文本是否输入完毕,可以在TextArea旁边设置一个按钮,通过按钮点击产生的ActionEvent对输入的文本进行处理。

8. 列表(List)

列表中提供了多个文本选项,列表支持滚动条,可以浏览多项

List lst=new List(4,false); //两个参数分别表示显示的行数、是否允许多选

lst.add("Venus");

lst.add("Earth");

lst.add("JavaSoft");

lst.add("Mars");

cnt.add(lst);

9. 框架(Frame)

Frame是顶级窗口,可以显示标题,重置大小。当Frame被关闭,将产生WindowEvent事件,Frame无法直接监听键盘输入事件。

10. 对话框(Dialog)

它是Window类的子类。对话框和一般窗口的区别在于它依赖于其它窗口。对话框分为非模式(non-modal)和模式(modal)两种。

11. 文件对话框(Filedialog)

当用户想打开或存储文件时,使用文件对话框进行操作。主要代码如下:

FileDialog d=new FileDialog(ParentFr,"FileDialog");

d.setVisible(true);

String filename=d.getFile();

12. 菜单(Menu)

无法直接将菜单添加到容器的某一位置,也无法使用布局管理器对其加以控制。菜单只能被添加?quot;菜单容器"(MenuBar)中。

13. MenuBar

只能被添加到Frame对象中,作为整个菜单树的根基。

Frame fr = new Frame("MenuBar");

MenuBar mb = new MenuBar();

fr.setMenuBar(mb);

fr.setSize(150,100);

fr.setVisible(true);

14. Menu

下拉菜单。它可以被添加到MenuBar中或其它Menu中。

Frame fr = new Frame("MenuBar");

MenuBar mb = new MenuBar();

fr.setMenuBar(mb);

Menu m1 = new Menu("File");

Menu m2 = new Menu("Edit");

Menu m3 = new Menu("Help");

mb.add(m1);

mb.add(m2);

mb.setHelpMenu(m3);

fr.setSize(200,200);

fr.setVisible(true);

MenuItem

MenuItem是菜单树中的"叶子节点"。MenuItem通常被添加到一个Menu中。对于MenuItem对象可以添加ActionListener,使其能够完成相应的操作。

Menu m1 = new Menu("File");

MenuItem mi1 = new MenuItem("Save");

MenuItem mi2 = new MenuItem("Load");

MenuItem mi3 = new MenuItem("Quit");

m1.add(mi1);

m1.add(mi2);

m1.addSeparator();

m1.add(mi3);

MenuBar和Menu都没有必要注册监听器,只需要对MenuItem添加监听器ActionListener,完成相应操作。

下表中列出了各个组件与所有的监听器的对应关系,打上"

"表明该组件可以注册此种监听器。

监听器接口

Act

Adj

Cmp

Cnt

Foc

Itm

Key

Mou

MM

Text

Win

Button

Canvas

Checkbox

CheckboxMenuItem

Choice

Component

Container

Dialog

Frame

Label

List

MenuItem

Panel

Scrollbar

ScrollPane

TextArea

TextField

Window

Act=ActionListener Adj=AdjustmentListener Cmp=ComponentListener

Cnt=ConatainerListener Foc=FocusListener Itm=ItemListener

Key=KeyListener Mou=MouseListener MM=MouseMotionListener

Text=TextListener Win=WindowListener

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有