.....
![](/images/load.gif)
4.3:EventAdapter----事件适配器
Java语言为一些Listener接口提供了适配器(Adapter)类。可以通过继承事件所对应的Adapter类,重写需要方法,无关方法不用实现。事件适配器为我们提供了一种简单的实现监听器的手段, 可以缩短程序代码。但是,由于java的单一继承机制,当需要多种监听器或此类已有父类时,就无法采用事件适配器了。
下例中采用了鼠标适配器:
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,完成相应操作。
下表中列出了各个组件与所有的监听器的对应关系,打上"
![](/images/load.gif)
监听器接口
Act
Adj
Cmp
Cnt
Foc
Itm
Key
Mou
MM
Text
Win
Button
![](/images/load.gif)
![](/images/load.gif)
![](/images/load.gif)
![](/images/load.gif)
![](/images/load.gif)
![](/images/load.gif)
Canvas
![](/images/load.gif)
![](/images/load.gif)
![](/images/load.gif)
![](/images/load.gif)
![](/images/load.gif)
Checkbox
![](/images/load.gif)
![](/images/load.gif)
![](/images/load.gif)
![](/images/load.gif)
![](/images/load.gif)
![](/images/load.gif)
CheckboxMenuItem
![](/images/load.gif)
Choice
![](/images/load.gif)
![](/images/load.gif)
![](/images/load.gif)
![](/images/load.gif)
![](/images/load.gif)
![](/images/load.gif)
Component
![](/images/load.gif)
![](/images/load.gif)
![](/images/load.gif)
![](/images/load.gif)
![](/images/load.gif)
Container
![](/images/load.gif)
![](/images/load.gif)
![](/images/load.gif)
![](/images/load.gif)
![](/images/load.gif)
![](/images/load.gif)
Dialog
![](/images/load.gif)
![](/images/load.gif)
![](/images/load.gif)
![](/images/load.gif)
![](/images/load.gif)
![](/images/load.gif)
![](/images/load.gif)
Frame
![](/images/load.gif)
![](/images/load.gif)
![](/images/load.gif)
![](/images/load.gif)
![](/images/load.gif)
![](/images/load.gif)
![](/images/load.gif)
Label
![](/images/load.gif)
![](/images/load.gif)
![](/images/load.gif)
![](/images/load.gif)
![](/images/load.gif)
List
![](/images/load.gif)
![](/images/load.gif)
![](/images/load.gif)
![](/images/load.gif)
![](/images/load.gif)
![](/images/load.gif)
![](/images/load.gif)
MenuItem
![](/images/load.gif)
Panel
![](/images/load.gif)
![](/images/load.gif)
![](/images/load.gif)
![](/images/load.gif)
![](/images/load.gif)
![](/images/load.gif)
Scrollbar
![](/images/load.gif)
![](/images/load.gif)
![](/images/load.gif)
![](/images/load.gif)
![](/images/load.gif)
![](/images/load.gif)
ScrollPane
![](/images/load.gif)
![](/images/load.gif)
![](/images/load.gif)
![](/images/load.gif)
![](/images/load.gif)
![](/images/load.gif)
TextArea
![](/images/load.gif)
![](/images/load.gif)
![](/images/load.gif)
![](/images/load.gif)
![](/images/load.gif)
![](/images/load.gif)
TextField
![](/images/load.gif)
![](/images/load.gif)
![](/images/load.gif)
![](/images/load.gif)
![](/images/load.gif)
![](/images/load.gif)
![](/images/load.gif)
Window
![](/images/load.gif)
![](/images/load.gif)
![](/images/load.gif)
![](/images/load.gif)
![](/images/load.gif)
![](/images/load.gif)
![](/images/load.gif)
Act=ActionListener Adj=AdjustmentListener Cmp=ComponentListener
Cnt=ConatainerListener Foc=FocusListener Itm=ItemListener
Key=KeyListener Mou=MouseListener MM=MouseMotionListener
Text=TextListener Win=WindowListener