Java事件处理

来源:互联网 发布:insert多条数据 编辑:程序博客网 时间:2024/05/01 12:59
Java事件处理
图形用户界面通过事件机制响应用户和程序的交互。产生事件的组件称事件源。如当用户单击某个按钮时就会产生动作事件,该按钮就是事件源。要处理产生的事件,需要在特定的方法中编写处理事件的程序。这样,当产生某种事件时就会调用处理这种事件的方法,从而实现用户与程序的交互,这就是图形用户界面事件处理的基本原理。
14.1 Java事件处理概述
JDK1.1之后Java采用的是事件源——事件监听者模型,引发事件的对象称为事件源,而接收并处理事件的对象是事件监听者,无论应用程序还是小程序都采用这一机制。
引入事件处理机制后的编程基本方法如下:
①对java.awt中组件实现事件处理必须使用java.awt.event包,所以在程序开始应加入import java.awt.event.*语句。
②用如下语句设置事件监听者:
事件源.addXXListener(XXListener代表某种事件监听者)。
③ 事件监听者所对应的类实现事件所对应的接口XXListener,并重写接口中的全部方法。
这样就可以处理图形用户界面中的对应事件了。要删除事件监听者可以使用语句:
事件源.removeXXListener;
【例14.1】图10.22所示程序演示了按钮单击事件的处理方法。用户单击Press Me按钮,在小程序的状态栏上显示“Button Clicked”信息。
//Fig. 10.22: ActionListenerDemo.java
//Demonstrating Action Listener
import java.awt.*;
import java.applet.*;
import java.awt.event.*;
public class ActionListenerDemo extends Applet implements ActionListener{
Button b=new Button("Press Me");
public void init(){
add(b);
//设置按钮b的监听者
b.addActionListener(this);
}
//实现ActionListener接口所定义的方法actionPerformed
public void actionPerformed(ActionEvent e){
showStatus("Button Clicked");
}
}

图14.1 Java事件处理示例
该例中,用户单击事件源即按钮b,触发ActionEvent,该事件不是由事件源本身处理,而是传递给动作事件监听者,从而自动调用actionPerformed方法对事件进行处理。
14.2 Java常用事件
Java将所有组件可能发生的事件进行分类,具有共同特征的事件被抽象为一个事件类AWTEvent,其中包括ActionEvent类(动作事件)、MouseEvent类(鼠标事件)、KeyEvent类(键盘事件)等。表10.17列出了常用Java事件类、处理该事件的接口及接口中的方法。
表14.1 常用Java事件类、处理该事件的接口及接口中的方法
事件类/接口名称接口方法及说明
ActionEvent动作事件类
ActionListener接口actionPerformed(ActionEvent e)
单击按钮、选择菜单项或在文本框中按回车时
AdjustmentEvent调整事件类
AdjustmentListener接口adjustmentValueChanged(AdjustmentEvent e)
当改变滚动条滑块位置时
ComponentEvent组件事件类
ComponentListener接口componentMoved(ComponentEvent e)组件移动时
componentHidden(ComponentEvent e)组件隐藏时
componentResized(ComponentEvent e)组件缩放时
componentShown(ComponentEvent e)组件显示时
ContainerEvent容器事件类
ContainerListener接口componentAdded(ContainerEvent e)添加组件时
componentRemoved(ContainerEvent e) 移除组件时
FocusEvent焦点事件类
FocusListener接口focusGained(FocusEvent e)组件获得焦点时
focusLost(FocusEvent e)组件失去焦点时
ItemEvent选择事件类
ItemListener接口itemStateChanged(ItemEvent e)
选择复选框、选项框、单击列表框、选中带复选框菜单时
KeyEvent键盘事件类
KeyListener接口keyPressed(KeyEvent e)键按下时
keyReleased(KeyEvent e) 键释放时
keyTyped(KeyEvent e)击键时
MouseEvent鼠标事件类
MouseListener接口mouseClicked(MouseEvent e) 单击鼠标时
mouseEntered(MouseEvent e)鼠标进入时
mouseExited(MouseEvent e)鼠标离开时
mousePressed(MouseEvent e)鼠标键按下时
mouseReleased(MouseEvent e) 鼠标键释放时
MouseEvent鼠标移动事件类
MouseMotionListener接口mouseDragged(MouseEvent e)鼠标拖放时
mouseMoved(MouseEvent e)鼠标移动时
TextEvent文本事件类
TextListener接口textValueChanged(TextEvent e)
文本框、多行文本框内容修改时
WindowEvent窗口事件类
WindowListener接口windowOpened(WindowEvent e)窗口打开后
windowClosed(WindowEvent e)窗口关闭后
windowClosing(WindowEvent e)窗口关闭时
windowActivated(WindowEvent e)窗口激活时
windowDeactivated(WindowEvent e) 窗口失去焦点时
windowIconified(WindowEvent e)窗口最小化时
windowDeiconified(WindowEvent e) 最小化窗口还原时


每个事件类都提供下面常用的方法:
① public int getID(),返回事件的类型;
② public Object getSource(),返回事件源的引用。
当多个事件源触发的事件由一个共同的监听器处理时,我们可以通过getSource方法判断当前的事件源是哪一个组件。
下面举一些事件处理的实例。
【例14.2】选择事件的处理。
图14.2的程序演示了选择事件的处理,其中ItemEvent的getItem()方法返回复选框的标签。
//Fig. 10.23: ItemListenerDemo.java
//demonstrating ItemListener
import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
public class ItemListenerDemo extends Applet implements ItemListener{
TextArea ta=new TextArea(6,30);
String[] city={"北京","上海","天津","济南","青岛"};
Checkbox cb[]=new Checkbox[5];
public void init(){
add(new Label("你选择的城市是: "));
add(ta);
add(new Label("请选择你喜爱的城市: "));
for(int i=0;i<5;i++){
cb[i]=new Checkbox(city[i]);
add(cb[i]);
//add ItemListener
cb[i].addItemListener(this);
}
}
//implementation of itemStateChanged method
public void itemStateChanged(ItemEvent e){
ta.append(e.getItem()+"/t");
}
}

图14.2 ItemListener示例
【例14.3】文本动作事件处理。
图14.3程序演示了文本事件类的处理。在左边文本框中输入文本时,右边文本框中会复制输入的文本。
//Fig. 10.24: TextListenerDemo.java
//demonstrating TextListener
import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
public class TextListenerDemo extends Applet implements TextListener{
TextField from;
TextField to;
public void init(){
from=new TextField(30);
to=new TextField(30);
to.setEditable(false);
add(new Label("输入一些文本: "));
add(from);
add(new Label("你输入的文本是: "));
add(to);
//add TextListener
from.addTextListener(this);
}
//implementation of textValueChanged method
public void textValueChanged(TextEvent e){
to.setText(from.getText());
}
}

图14.3 TextListener示例
【例14.4】鼠标事件及鼠标移动事件的处理。
图10.25的程序演示了鼠标事件的处理。按下鼠标左键拖动鼠标可以在小程序中画线,松开左键停止。
//Fig. 10.25: MouseEventDemo.java
//demonstrating MouseListener and MouseMotionListener
import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
public class MouseEventDemo extends Applet implements MouseListener, MouseMotionListener
{
int x1,y1,x2,y2;
public void init(){
addMouseListener(this);
addMouseMotionListener(this);
}
public void paint(Graphics g){
g.drawLine(x1,y1,x2,y2);
}
//implementation of MouseListener
public void mousePressed(MouseEvent e){
x1=e.getX();
y1=e.getY();
}
public void mouseClicked(MouseEvent e){}
public void mouseEntered(MouseEvent e){}
public void mouseExited(MouseEvent e){}
public void mouseReleased(MouseEvent e){}
//implementation of MouseMotionEvent
public void mouseDragged(MouseEvent e){
x2=e.getX();
y2=e.getY();
repaint();
}
public void mouseMoved(MouseEvent e){}
}

图14.4 鼠标事件演示
【例14.5】调整事件类。
图14.5的程序演示了调整事件的处理方法。试着滑动滚动条,其上边的标签即会显示滚动条的值。
//Fig. 10.26: AdjustmentListenerDemo.java
//demonstrating AdjustmentListener
import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
public class AdjustmentListenerDemo extends Applet implements AdjustmentListener{
Label label1=new Label("0",Label.CENTER);
Scrollbar scrollbar1;
public void init(){
scrollbar1=new Scrollbar(Scrollbar.HORIZONTAL);
scrollbar1.setMinimum(0);
scrollbar1.setMaximum(100);
//add AdjustmentListener to scrollbar
scrollbar1.addAdjustmentListener(this);
setLayout(new BorderLayout());
add(label1,BorderLayout.CENTER);
add(scrollbar1,BorderLayout.SOUTH);
}
//implementation of AdjustmentListener
public void adjustmentValueChanged(AdjustmentEvent e){
label1.setText(""+scrollbar1.getValue());
}
}

图14.5 AdjustmentListener示例
【例14.6】窗口事件处理。
图14.6演示窗口事件处理。该程序创建了一个可关闭的窗口。要创建可关闭的窗口,只需实现WindowListener接口提供的windowClosing方法,使用语句:
System.exit(0);
即可返回操作系统。
//Fig. 10.27: WindowListenerDemo.java
//demonstrating WindowListener
import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
public class WindowListenerDemo extends Frame implements WindowListener{
public WindowListenerDemo(){
super("可关闭的窗口");
setSize(300,200);
setVisible(true);
//add WindowListener to this frame
addWindowListener(this);
}
//implementation of WindowListener
public void windowOpened(WindowEvent e){}
public void windowClosed(WindowEvent e){}
public void windowIconified(WindowEvent e){}
public void windowDeiconified(WindowEvent e){}
public void windowActivated(WindowEvent e){}
public void windowDeactivated(WindowEvent e){}
public void windowClosing(WindowEvent e){
System.exit(0);//return to OS
}
public static void main(String[] args){
new WindowListenerDemo();
}
}
编译生成class文件后,使用Java解释器运行,结果如图14.6。单击关闭按钮,可关闭该窗口。

图14.6 创建可关闭的窗口
10.3 事件适配器
为了进行事件处理,需要创建实现Listener接口的类,而按Java的规定,在实现该接口的类中,必须同时实现接口中所定义的全部方法。在具体程序设计过程中,有可能我们只用到接口中的一个或几个方法。为了方便,Java为那些声明了多个方法的Listener接口提供了一个对应的适配器(Adapter)类,在该类中实现了对应接口的所有方法,只是方法体为空。比如:窗口事件适配器的定义如下:
public abstract class WindowAdapter extends Object implements WindowListener{
public void windowOpened(WindowEvent e){}
public void windowClosing(WindowEvent e){}
public void windowClosed(WindowEvent e){}
public void windowIconified(WindowEvent e){}
public void windowDecionified(WindowEvent e){}
public void windowActivated(WindowEvent e){}
public void windowDeactivated(WindowEvent e){}
}
由于在接口对应适配器类中实现了接口的所有方法,因此,我们在创建新类时,可以不实现接口,而是只继承某个适当的适配器,并且仅覆盖所关心的事件处理方法即可。注意,在使用适配器时,一定确保所覆盖的方法书写正确!
表14.2列出了接口及对应的适配器类。你只需把接口名称中的Listener用Adapter代替即为对应适配器的名称。接口ActionListener、AdjustmentListener、ItemListener、TextListener 均只有一个方法,不需要定义适配器。
表10.18接口及对应适配器类
接口名称适配器名称
ComponentListenerComponentAdapter
ContainerListenerContainerAdapter
FocusListenerFocusAdapter
KeyListenerKeyAdapter
MouseListenerMouseAdapter
MouseMotionListenerMouseMotionAdapter
WindowListenerWindowAdapter


【例14.7】通过适配器来创建一个可关闭的窗口。
程序的运行结果与上例相同,但程序编写更加简单,结构更加合理。
//Fig. 10.28: WindowAdapterDemo.java
//demonstrating the use of WindowAdapter
import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
public class WindowAdapterDemo extends Frame{
public WindowAdapterDemo(){
super("可关闭的窗口");
setSize(300,200);
setVisible(true);
//use WinAdapter
addWindowListener(new WinAdapter());
}
public static void main(String[] args){
new WindowAdapterDemo();
}
//must extends WindowAdapter
class WinAdapter extends WindowAdapter{
//only rewrite the necessary method
public void windowClosing(WindowEvent e){
System.exit(0);
}
}
}
14.4 Swing组件介绍
在Java中,能够实现图形用户界面的类库两个:java.awt和javax.swing。后者是Java基础类库(JFC)的一个组成部分,提供了一套比前者功能更强、数量更多、更加美观的图形用户界面组件。
对于初学者,记住以下几点对学习Swing的使用是大有帮助的:
(1)若类的属性被命名为xxx,则相应对该属性操作方法命名为:getXxx(),setXxx(),isXxx()等;
(2)Swing使用同AWT相同的事件模型。处理Swing中的事件时除使用java.awt.event包外,有时还要乃至javax.swing.event包。
(3)大多数情况下在AWT组件前加一个“J”即为Swing组件。
Swing和AWT最大差别在于Swing组件类不带本地代码,因此不受操作系统平台的限制,具有比AWT更强的功能,比如:Swing按钮和标签类可以显示图像标题且可被制作成非矩形形状、可以为Swing组件加边框、能够自动适应操作系统外观等。
有关Swing组件的使用方法大致与AWT组件相同,有关Swing组件的演示请参阅J2SDK自带的演示程序,文件为:
JDK安装目录/demo/jfc/SwingSet2/SwingSet2.jar
若双击打不开该程序,可在命令行输入以下命令:
java SwingSet2.jar –jar
有关Swing组件的使用,感兴趣的同学可以参考Sun Micorsystems公司Java? 2 Platform, Standard Edition, V1.4.2 API Specification,该文档可以从Sun公司网站免费下载,或可参阅有关书籍,这里不再赘述。
小结
GUI是由事件驱动的。Java使用事件源-监听者模型对事件进行处理。
Swing组件提供了比AWT组件更多、功能更强、更加美观的组件,Swing组件包含在javax.Swing包中。

本文转自
http://blog.chinaunix.net/u2/60295/showart.php?id=479597
原创粉丝点击