java事件处理总结

来源:互联网 发布:凤凰电影台直播软件 编辑:程序博客网 时间:2024/06/01 22:08
  
JAVA事件无非就是键盘事件,鼠标事件,按钮等事件。专业点可以分为语义事件(按钮等到事件)和低层事件(键盘事件,鼠标事件);

下面我简要的总结一下:


 1、鼠标事件:点鼠标按钮事它会调用三个监听器方法:mousePressed,mouseReleased,mouseClicked.
鼠标事件提供了mousePressed,mouseClicked,mouseDragged,mouseEntered,mouseExited, mouseUp,mouseDown,mouseDrag等事件。下面介绍一个鼠标一例子:
import java.awt.*;
import java.applet.Applet;
public class CountClick extends Applet
{int CurrentMarks=0;
int a,b;
 public boolean mouseDown(Event evt,int x,int y)//鼠标按下时做的事
 CurrentMarks++;//计录按下次数
   repaint();//刷新面版
   a=x;//得到鼠标的横坐标
   b=y;//得到鼠标的竖坐标
   return true;
 }
 public void paint(Graphics g)
 g.drawString(" "+CurrentMarks,10,10);//打印按下次数
   g.drawString(" "+a,10,30);//打印鼠标的横坐标
   g.drawString(" "+b,10,20);//打印鼠标的坚坐标
 }
}
//<applet code="CountClick.class" width="200" height="100"></applet>      

      
   2、键盘事件:如果我们希望使用键盘获得输入信息,就必须处理键盘事件。我们可以用在Conponent的keyDown来实现。如下例子:
import java.applet.Applet;import java.awt.*;
  char Presskey;
     public boolean keyDown(Event evt, int key)
       Presskey=(char)key;//记录你按下的键
     repaint(); return true;
}
      public void paint(Graphics g)
        g.drawString(Presskey,10,10); }//打印你按下的键值
}
   3、铵钮等事件:这方面的内容比较多,通过一个例子做一个简单的介绍。

//
///

import java.awt.*;
import java.applet.Applet;
import java.awt.event.*;
public class Awtactiontest2 extends Applet implements ItemListener ,ActionListener
//实现ItemListener ,ActionListener接口
{
 int num 5;
  Choice ch=new Choice ();
 Button one=new Button("one");
 Button two=new Button("two"); 
 Button three=new Button("three");
 Image  aa[];
 Image  a;
 public void init()
 {
        aa new Image[num];
        for(int 0; num; i++)//把图片的路径加到数组中存储
        {
            aa[i] getImage(getdocument.ase(),"A"+(i+1)+".JPG");
        }
        num=4;//给一个初值
 this.setBackground(Color.white);
 ch. addItem("A1.JPG" );
 ch. addItem ("A2.JPG" );
 ch. addItem ("A3.JPG" );
 ch. addItem ("A4.JPG" );
 add (ch);
 getImage(getdocument.ase(),"A1.JPG");//对a一个初值;
 add (one);
 add (two);
 add (three);
 ch.addItemListener(this);//注意把ItemListener接口implements进来
 one.addActionListener(this);//注意把ActionListener接口implements进来
 two.addActionListener(this);
 three.addActionListener(this);
 }
public void itemStateChanged (ItemEvent e)
  {
   
    getImage(getdocument.ase(),ch.getSelectedItem ());
    repaint();
  }
 public void actionPerformed(ActionEvent e)
 {
 if(e.getSource()==one)
 {
        num=1;
        repaint();//对程序刷新
 }
 if(e.getSource()==two)
 {
        num=2;
        repaint();
 }
 if(e.getSource()==three)
 {
        num=3;
        repaint();
 }
 }
 public void paint(Graphics g)
 {
        //g.drawImage(aa[i],0,0,this);
     
  int w=a.getWidth(this);
  int h=a.getHeight(this);
 // g.drawLine(100,1,200,500);
 try{ 
 g.drawImage(a,20,300,10+w,20+h,this);//要抓异常,如果图片找不到呢
 g.drawImage(aa[num],50,50,200,200,this);
 }
 catch(Exception e)
 {
  System.out.println(e);
 }
  }
 public boolean handleEvent(Event ewt)//关窗体,我原以为这个可以把死循环给关了,其它不然.一样的关不了程序
 {
         if(ewt.id==Event.WINDOW_DESTROY)
          System.exit(0);
          else 
          return super.handleEvent(ewt);
          return true;
 }
}
//<Applet code="Awtactiontest2.class" width=400 height=500></applet>

*
JAVA的事件处理
**
低级事件:
 ComponentEvent(组件事件:组件尺寸的变动,移动)
 ContainerEvent(容器事件:组件增加,移动)
 WindowEvent(窗口事件:关闭窗口,窗口闭合,图标化)
 FocusEvent
 KeyEvent
 MouseEvent
**
高级事件:
 ActionEvent
 AdjustmenEvent
 ItemEvent
 TextEvent
  
***
◇ 注册监听器:
  public void add<ListenerType> (<ListenerType>listener);

◇ 注销监听器:
  public void remove<ListenerType> (<ListenerType>listener);
****
AWT事件及相应的事件接口 

                              

 事件类别: ActionEvent
 描述信息:  激活组件
 接口名:  ActionListener
 方法:    actionPerformed(ActionEvent)
 
 ItemEvent
  选择了某些项目
     ItemListener
    itemStateChanged(ItemEvent)
 
 MouseEvent
  鼠标移动
    MouseMotionListener
    mouseDragged(MouseEvent)
   mouseMoved(MouseEvent)
 
 鼠标点击等
    MouseListener
    mousePressed(MouseEvent)
  mouseReleased(MouseEvent)
   mouseEntered(MouseEvent)
   mouseExited(MouseEvent) 
   mouseClicked(MouseEvent)
 
 KeyEvent
  键盘输入
    KeyListener
    keyPressed(KeyEvent)
   keyReleased(KeyEvent)
   keyTyped(KeyEvent)
 
 FocusEvent
  组件收到或失去焦点
    FocusListener
  focusGained(FocusEvent)
  focusLost(FocusEvent)
 
 AdjustmentEvent
  移动了滚动条等组件
   AdjustmentListener
    adjustmentValueChanged(AdjustmentEvent)
 
 ComponentEvent
  对象移动缩放显示隐藏等
    ComponentListener
  componentMoved(ComponentEvent)
  componentHidden(ComponentEvent)
  componentResized(ComponentEvent)
  componentShown(ComponentEvent)
 
 WindowEvent
  窗口收到窗口级事件
    WindowListener
   windowClosing(WindowEvent)
   windowOpened(WindowEvent)
   windowIconified(WindowEvent)
   windowDeiconified(WindowEvent)
   windowClosed(WindowEvent)
   windowActivated(WindowEvent)
   windowDeactivated(WindowEvent) 
 
 ContainerEvent
 容器中增加删除了组件
    ContainerListener
  componentAdded(ContainerEvent)
  componentRemoved(ContainerEvent) 
 
 TextEvent
 文本字段或文本区发生改变
    TextListener
    textValueChanged(TextEvent)
***** 
 使用事件适配器:Java语言为一些Listener接口提供了适配器(Adapter)类。可以通过继承事件所对应的Adapter类,重写需要方法,无关方法不用实现。事件适配器为我们提供了一种简单的实现监听器的手段, 可以缩短程序代码。


下面代码是一个关于使用鼠标适配器的例子:
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( 窗口适配器)


----------------------------------------------

得首先明白java中的事件机制的参与者

有3种角色:

1.eventobject:就是事件产生时具体的“事件”,用于listener的相应的方法之中,作为参数,一般存在与listerner的方法之中

2.eventsource:具体的接受事件的实体,比如说,你点击一个button,那么button就是eventsource,这样你必须使button对某些事件进行相应,你就需要注册特定的listener,比如说MouseEvent之中的MouseClicked方法,这是他就必须有了add方法

3.event listener:具体的对监听的事件类,当有其对应的eventobject产生的时候,它就调用相应的方法,进行处理。在windows程序设计里边这种相应使用callback机制来实现的
---------------------------------------------
这样或许过于抽象, 举个例:
假如你是某娱乐报刊的记者, 要追踪报道某名星, 比如谭咏麟, 张学友,刘德华
在这里,event listener就是报刊的记者, event source就是谭咏麟,张学友, 刘德华他们,
是他们三个没错, 但总不能所有日常行为都报道吧,
所以得定义出什么要报道的, 比如开演唱会,比如他们中的某个和新生代某女走在一起了 等等,
这些就是event object.

假如你boss让你跟踪谭咏麟有没有开演唱会,张学友和刘德华有没有出新专辑和酒后驾车,
于是你这个event listener就在记事本上list下这些,也就是在谭咏麟这个.event source上add一个有没有开演唱会的方法,分别在张学友和刘德华上add一个有没有出新专辑和add一个有没有酒后驾车的方法,

你的追踪报道都是以list为依据的, 谭咏麟酒后驾车这件事发生了,但是你boss没有让你留意这个, 也就是在 谭咏麟这个eventsource上没有监听酒后驾车这事, 所以没有响应报道, 张学友出新专辑,你查看list, 原来有这行, 哗哗声来个快讯报道出来.
-------------------------------------------------------------
原理大概就是上面这个. 更加专业的解释就是

-------------------------------
Java做的图形界面软件通过事件响应机制实现用户与程序的交互,原理大概是这样:
首先,在java控件对象(比如文本框)上添加一个监控对象,方法是one.addXXXListenner(two),这就相当于你要对某人进行监听,先要在他身上绑定一个窃听器一样,这里“one”就是你要监听的那个家伙,two就是你自己造的一个窃听器。
第二步就是要考虑怎样造这个窃听器了,我们首先要搞清楚它要实现的功能:它不仅能够监听one的一举一动,还能够把监听到的事件告诉系统,并让系统对这个事件做出相应的处理。Java中是通过接口实现这样的功能的。这些接口请参见jdk中java.awt.event包,里面那几个XXXListener就是(不是很多,常用的更少)。在这些接口中定义了一些方法,这些方法就是相应的事件处理方式,它们只由系统调用并且都有一个事件类的对象作为参数,这个参数正是联系发生事件主体one和操作系统的纽带。当然接口是虚的,不能产生对象的;所以想必你也猜到,上面的“窃听器”two的类型肯定是某个实现了XXXListener接口的类。
好了,现在在回顾一下这个过程:
(1)用户通过鼠标、键盘等在one对象上做动作(比如点击鼠标),
(2)这个动作被two监听到并产生事件对象e(即XXXEvent的对象),
(3)two通过事件e对象向系统打报告,
(4)系统调用two中实现的方法对事件进行处理,并向方法传送事件e。
如果你清楚了这个过程,再来细看一下这个XXXListener接口。我们必须用类来实现接口的方法(这是java基础知识吧◎),再用这个类产生two这样的对象。类实现接口必须实现接口中的每个方法,而实际上我们需要的也许只是该接口中的某一个方法(比如处理鼠标右键点击的那个),那么每个方法还得去实现一个空的,真是浪费。Sun为了让程序员省点事,在JDK中已经为我们把这些接口实现好了,这些类就是我们所谓的“适配器”(XXXAdapter),我们只需要继承(extends)这些类并重写里面我们需要的方法就OK了,所以,其实适配器就是类,只不过这些类中只有一些空的方法,别无所有。
到此,你大概明白程序员在事件处理过程中该做哪些事了吧:
(1)制造“窃听器”,即:实现事件监听接口,重写相关方法,
(2)安装窃听器,即:为监控对象添加监听器。

下面,我们通过程序再来仔细看看事件响应的实现方式(待续):
(以下内容参考陈刚《eclipse从入门到精通》)
(1)、 匿名内部类写法
例程:
text.addMouseListener(new MouseAdapter() {
public void mouseDoubleClick(MouseEvent e){//鼠标双击事件的方法
//打开一个信息框
MessageDialog.openInformation (null,"","Hello World");
}
});
newMouseAdapter()就是一个匿名内部类。其实就是在实现类的同时用new构造一个该类的对象,并把它作为addMouseListener的参数,它的效果和下面的一样,只不过代码比较集中。

(2)、命名内部类写法
public class HelloWorld {
public static void main(String[] args) {
……
Text text = new Text(shell, SWT.BORDER);
//加入鼠标事件监听器,并用下面代码所定义的内部类生成一个对象
text.addMouseListener(new MyMouseDoubleClick());
……
}

//定义一个名为MyMouseDoubleClick的内部类
private static final class MyMouseDoubleClick extends MouseAdapter{
public void mouseDoubleClick(MouseEvent e) {
MessageDialog.openInformation(null, "", "Hello World");
}
}
}

(3)、外部类写法
这种写法和命名内部类有些相似,只不过是将MyMouseDoubleClick类从HelloWorld.java中拿出去,单独写成一个类文件。实现代码如下
//文件1: HelloWorld.java
public class HelloWorld {
public static void main(String[] args) {
……
Text text = new Text(shell, SWT.BORDER);
//加入鼠标事件监听器,并用下面代码所定义的内部类生成一个对象
text.addMouseListener(new MyMouseDoubleClick());
……
}
}

//文件2:MyMouseDoubleClick.java
public class MyMouseDoubleClick extends MouseAdapter {
public void mouseDoubleClick(MouseEvent e) {
MessageDialog.openInformation(null, "", "Hello World");
}
}
(4)、实现监听接口的写法
将HelloWorld类实现MouseListener接口,这样类本身就成了一个监听器,使得加入监听器的代码可以更简洁。这种方式适合加入监听器的组件较多,且要求监听器的事件处理代码可以被组件共用。这种方式还有一个要注意的地方:事件方法和其他方法混合在了一起,容易引起误读,所以应该在事件方法前加入详细的注释说明。
实现MouseListener接口要写的事件方法多一些,当然没用的事件方法可以空实现。如果继承MouseListener接口的适配器MouseAdapter,则只写需要的方法就行了。另外要注意:只有接口才能有多继承的特性,所以如果HelloWorld已经是某个类的子类,就只能用实现接口的方式,而不能继承接口的适配器了。
给出示例代码如下:
public class HelloWorld extends MouseAdapter{//或implementsMouseListener
public static void main(String[] args) {
……
Text text1 = new Text(shell, SWT.BORDER);
Text text2 = new Text(shell, SWT.BORDER);
text1.addMouseListener(this);
text2.addMouseListener(this);
……
}

public void mouseDoubleClick(MouseEvent e) {
MessageDialog.openInformation(null, "", "Hello World");
}
}

0 0
原创粉丝点击