首页 > 代码库 > GUI图形界面编程之事件处理机制

GUI图形界面编程之事件处理机制

 

事件处理机制三要素:

事件源:能够产生事件的组件

事件:用户对组件的一个操作

事件监听器:接收事件、解释事件并处理用户交互的方法处理事件源发生的事件

事件处理机制:当组件(比如 Button)被点击时就会产生ActionEvent事件,事件被传递给一个 ActionListener 对象,再由ActionListener 定义的方法来响应处理事件(自动调用ActionEvent)

当事件发生后,将某事件的对象传递给事件监听器(事件监听器实现了发生此事件所对应的接口),事件监听器会处理此事件,为了监视此事件,事件的处理方要先向发生方注册

事件有很多种,监听事件所实现的接口也有很多种。监听哪件事,就必须实现此事件的接口。事件与监听事件的接口一 一对应

按钮事件处理机制:

按钮事件(ActionEvent):组件的特定动作(比如被按下)发生时,由组件(比如 Button)生成此高级别事件

要使用键盘在 Button 上触发 ActionEvent,请使用空格键

监听器接口:ActionListener

 

一个监听器监听一个事件源对象

import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;




/**
 *
 *程序功能:
 *时间:
 * @author Administrator
 */
public class Test1 {

    /**
     * @param args
     */

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        //创建面板及按钮
        Frame f=new Frame();
        Button b=new Button();
        f.add(b,BorderLayout.NORTH);
        f.setVisible(true);
        f.setResizable(true);
        f.pack();

        //创建监听器
        Monitor bh=new Monitor();
        //事件注册:表示监听器bh监听对象b,当事件发生后,调用接口中的方法
        b.addActionListener(bh);

    }

}

class Monitor implements ActionListener{
    //当事件触发时执行此方法
    //当事件发生后,把此事件具体信息封装成对象传递给此函数的参数e
    public void actionPerformed(ActionEvent e){
        System.out.println("Press!!!\n");

    }
}

1个监听器监听多个事件源对象

import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;




/**
 *
 *程序功能:
 *时间:
 * @author Administrator
 */
public class Test1 {

    /**
     * @param args
     */

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        //创建面板及按钮
        Frame f=new Frame();
        Button b1=new Button();
        Button b2=new Button();
        f.add(b1,BorderLayout.NORTH);
        f.add(b2,BorderLayout.CENTER);
        f.setVisible(true);
        f.setResizable(true);
        f.pack();

        //创建监听器
        Monitor bh=new Monitor();
        //事件注册:表示监听器bh监听对象b,当事件发生后,调用接口中的方法
        b1.addActionListener(bh);
        b2.addActionListener(bh);
        //重设提示
        b2.setActionCommand("Stop!!!");
    }

}

class Monitor implements ActionListener{
    //当事件触发时执行此方法
    //当事件发生后,把此事件具体信息封装成对象传递给此函数的参数e
    public void actionPerformed(ActionEvent e){
        System.out.println("Press!!!\n"+e.getActionCommand());
        
    }
}

 

TextField 对象可能发生Action(光标在文本框中敲回车)事件,与该事件对应的事件类是java.awt.event.ActionEvent. java.awt.event.ActionListener接口处理ActionEvent事件

创建文本框并实现文本框输入显示到命令行中

文本框输入内容不可见

import java.awt.Frame;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;


public class Test2 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        new TextFieldDemo();
    }

}
class TestFieldDemo extends Frame {

    TestField tf=null;
    Monitor2 m=null;
    TestFieldDemo(){

        //创建面板
        tf=new TestField();
        this.add(tf);
        this.setVisible(true);
        this.pack();

        //设置此文本字段的回显字符(用于输入密码)
        tf.setEchoChar(‘*‘);
        //创建监听器
        m=new Monitor2();                                              
        //注册
        tf.addActionListener(m);

    }
}


class Monitor2 implements ActionListener{
    public void actionPerformed(ActionEvent e){
        TextField tf=(TextField)e.getSource();
        System.out.println(tf.getText());
        tf.setText("");
        
        

    }

}

内部类:可以方便的访问包装类的成员变量或成员方法。

    不允许或不需要被其他类访问

import java.awt.Button;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.Label;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
/**
 *
 *程序功能:实现一个加法运算。两个加数及结果数放在文本框中,通过按钮事件处理机制实现。
 *时间:2014-5-11
 *
 * @author Administrator
 */


public class Test4 {
    public static void main(String[] args){
        new FrameDemo().LaunchFrame();

    }
}


class FrameDemo extends Frame{
    TextField t1=null;
    TextField t2=null;
    TextField t3=null;

    public void LaunchFrame(){
        //创建面板
        t1=new TextField(10);
        t2=new TextField(10);
        t3=new TextField(15);
        Label l=new Label("+");
        Button b=new Button("=");

        this.setLayout(new FlowLayout());
        this.add(t1);
        this.add(l);
        this.add(t2);
        this.add(b);
        this.add(t3);
        this.setResizable(true);
        this.pack();
        this.setVisible(true);


        //创建监控器及监控按钮事件
        b.addActionListener(new Monitor3());

    }
    //内部类  访问包装类的成员

    class Monitor3 implements ActionListener{

        int t11=0;
        int t22=0;
        
        public void actionPerformed(ActionEvent e){

            //取出t1,t2文本框中的内容
            try{
                t11=Integer.parseInt(t1.getText());
                t22=Integer.parseInt(t2.getText());
            }catch(NumberFormatException e2){
                e2.printStackTrace();
            }

            //将t11与t22的和显示在t3文本框中
            t3.setText("" + (t11+t22));

        }

    }
}

 

Graphic类:用于窗口画图,相当于画笔。

要想在哪个组件中画图,就在哪个组件中重写paint(Graphic g)方法。

paint方法在需要重画的时候自动调用。比如显示窗口,窗口最大化,最小化等

import java.awt.*;
/**
 * 
 *
 *程序功能:在面板上显示图案
 *
 * @author Administrator
 */

public class PaintDemo {
    public static void main(String[] args) {
        new PaintFrame().launchFrame();
    }
}

class PaintFrame extends Frame {
    
    public void launchFrame() {
        //创建面板
        setBounds(200,200,640,480);
        setVisible(true);
    }
    
    //使用paint方法画图
    public void paint(Graphics g) {
        //保存默认颜色
        Color c = g.getColor();
        g.setColor(Color.red);
        g.fillOval(50, 50, 30, 30);
        g.setColor(Color.green);
        g.fillRect(80,80,40,40);
        //恢复默认颜色
        g.setColor(c);
    }
    
}

 

鼠标事件处理机制:

鼠标事件(MouseEvent):当且仅当动作发生时鼠标光标处于特定组件边界未被遮掩的部分上,才认为在该组件上发生了鼠标动作,生成此低级别事件

监听器接口:MouseListener:鼠标事件

                 MouseMotionListener:鼠标移动事件

对于以下动作,组件对象将生成此低级别事件:

鼠标事件

按下鼠标按键

释放鼠标按键

单击鼠标按键(按下并释放)

鼠标光标进入组件几何形状的未遮掩部分

鼠标光标离开组件几何形状的未遮掩部分

鼠标移动事件

移动鼠标

拖动鼠标

 

import java.awt.*;
import java.awt.event.*;
import java.util.*;
public class Test{
  public static void main(String args[]) {
    new MyFrame("drawing...");
  }
}

class MyFrame extends Frame {
  ArrayList points = null;
  MyFrame(String s) {
    super(s);
    points = new ArrayList(); 
    setLayout(null);
    setBounds(300,300,400,300); 
    this.setBackground(new Color(204,204,255));
    setVisible(true);
    this.addMouseListener(new Monitor());
    }
    
    public void paint(Graphics g) {
    Iterator i = points.iterator();
    while(i.hasNext()){
      Point p = (Point)i.next();
      g.setColor(Color.BLUE);
      g.fillOval(p.x,p.y,10,10);
    }
  }
  
  public void addPoint(Point p){
    points.add(p);
  }
}

class Monitor extends MouseAdapter {
  public void mousePressed(MouseEvent e) {
    MyFrame f = (MyFrame)e.getSource();
    f.addPoint(new Point(e.getX(),e.getY()));
    f.repaint();
  }
}

实现了监听器接口的类:MouseAdapter,MouseMotionAdapter

创建的监听器一般不继承MouseListener,而是继承MouseAdapter。因为MouseListener接口有多于一个方法。但是实现后一般只使用一个方法。如果要实现接口,除了要使用的方法要重写外,其他不需要使用的方法也要重写成空方法,比较麻烦。而MouseAdapter已经把接口中的所有方法重写成空方法。如果继承MouseAdapter,只需要重写你需要的方法即可。

window事件处理:

window事件(WindowEvent):

监听器接口:WindowListener

实现了监听器接口的类:WindowAdapter

实现关闭窗口

import java.awt.*;
import java.awt.event.*;
public class Test2 {
    public static void main(String args[]) {
        new MyFrame55();
    }
}
class MyFrame55 extends Frame {
    MyFrame55() {

        setLayout(null);
        setBounds(300, 300, 400, 300);
        this.setBackground(Color.black);
        setVisible(true);
        
        this.addWindowListener(new MyWindowMonitor());
    }

    class MyWindowMonitor extends WindowAdapter {
        public void windowClosing(WindowEvent e) {
            setVisible(false);
            System.exit(0);
        }
    }

}

匿名类:

方法里的逻辑简单、语句比较少、不经常变动时使用

import java.awt.*;
import java.awt.event.*;
public class Test2 {
    public static void main(String args[]) {
        new MyFrame55();
    }
}
class MyFrame55 extends Frame {
    MyFrame55() {

        setLayout(null);
        setBounds(300, 300, 400, 300);
        this.setBackground(Color.black);
        setVisible(true);


        this.addWindowListener(
                new WindowAdapter() {
                    public void windowClosing(WindowEvent e) {
                        setVisible(false);
                        System.exit(-1);
                    }
                });
    }

}

键盘事件处理机制:

键盘事件(KeyEvent):表示组件中发生键击的事件。当按下、释放或键入某个键时,组件对象(如文本字段)将生成此低级别事件。

监听器接口:KeyListener

实现了监听器接口的类:KeyAdapter

 

当使用键盘上”向上箭头“键时,做出反应

import java.awt.*;
import java.awt.event.*;

public class Test {
    public static void main(String[] args) {
        new KeyFrame().launchFrame();
    }
}

class KeyFrame extends Frame {
    public void launchFrame() {
        setSize(200, 200);
        setLocation(300,300);
        addKeyListener(new MyKeyMonitor());
        setVisible(true);
    }

    class MyKeyMonitor extends KeyAdapter {
        public void keyPressed(KeyEvent e) {
            int keyCode = e.getKeyCode();
            if(keyCode == KeyEvent.VK_UP) {
                System.out.println("UP");
            }
        }
    }



    class Monitor2 extends WindowAdapter{
        public void windowClosing(WindowEvent e){
            setVisible(true);
            System.exit(0);

        }


    }
}