JAVA中实现窗口事件监听的两种方案

来源:互联网 发布:手机棋牌游戏源码下载 编辑:程序博客网 时间:2024/06/05 09:10

 

1.      AWT委托事件模型的基本概念及实现事件监听的流程

事件:是指一个状态的改变或者活动的发生。例如,单击窗口关闭按钮,将改变该窗口的状态,产生窗口关闭事件;单击一个按钮,将产生单击事件等。

事件类:不同的事件需要封装成不同的事件类。JAVAjava.awt.event包中定义了许多事件类,如窗口事件类(WindowEvent)和单击事件类(AcitionEvent)等,javax.Swing.event包中也有很多事件类。

事件源:事件源由用户操作产生,产生事件的组件称为事件源。例如,用户单击窗口关闭按钮的操作,产生窗口关闭事件,此时框架窗口组件就是事件源;单击一个按钮,将产生单击事件,此时的按钮组件就是事件源等。

事件监听器:事件发生时被通知的对象。主要分两步实现:事件源注册事件监听器和事件注册方法。

java.awt.Event包中的每个事件类都有一个对应的接口,在接口中声明了一个或多个抽象事件的处理方法,如ActionListner中的actionPerformed()方法。

如果一个类实现了事件监听器接口,即是注册了事件监听器,那么该类就具备了响应指定事件和事件处理的能力。例如,一个类为一个按钮注册了事件监听器addActionListner,并且实现了ActionListner接口中的actionPerformed()方法,则当单击事件发生时,就能执行actionPerformed()方法。

按钮单击事件的响应处理程序及处理流程为:

用户à单击按钮à事件源(Buttonà注册的à单击事件监听器à创建ActionEvent事件对象eà委托执行à执行ActionListner接口中的actionPerformed(ActionEvent e)事件处理方法。

2.      窗口事件实现方案

根据接口的性质,一个类如果实现了一个接口,就必须实现接口中所有的抽象方法。因此,一个类如果要实现一个包含多个方法的接口,即使只需要处理一个事件,也必须实现所有方法,对于不需要响应的事件处理方法也必须设计为空。

JAVA为此提供了一种简便的方法,即事件适配器类,类名带有Adapter标记。这样便引出了窗口事件的两种实现方法:

1)  直接在类中实现接口,对不需要响应的窗口事件置为空

2)  利用窗口适配器(WindowAdapter),继承它,即只需实现需要响应的事件。

3.      实例:一个简单的响应单击事件和窗口事件的计算器程序雏形

该窗口模拟Windows的计算器功能,添加一个文本行和四个按钮,单击【1】,【2】,【+】按钮时,将按钮的标签添加到文本行中;点击【C】按钮时,清空文本行内容;单击窗口的关闭按钮时,将关闭窗口。

程序如下:

import java.awt.event.*;

import java.awt.*;

 

public class CalculatorFrameextends Frame implements ActionListener

{

    private TextField text;

    private Button button1,button2,buttonPlus,buttonCancel;

    public CalculatorFrame()

    {

       super("Calculator");

       this.setSize(320,120);

       this.setBackground(java.awt.Color.lightGray);

       this.setLocation(300, 400);

       this.setLayout(new java.awt.FlowLayout(FlowLayout.LEFT));

      

       text = new TextField(40);

       text.setEditable(false);

       this.add(text);

 

       button1 = new Button("1");

       button2 = new Button("2");

       buttonPlus = new Button("+");

       buttonCancel = new Button("C");

       this.add(button1);

       this.add(button2);

       this.add(buttonPlus);

       this.add(buttonCancel);

       button1.addActionListener(this);

       button2.addActionListener(this);

       buttonPlus.addActionListener(this);

       buttonCancel.addActionListener(this);

       this.addWindowListener(new WinClose());

       this.setVisible(true);

    }

    //button event method

    public void actionPerformed(ActionEvent e) {

       // TODO Auto-generatedmethod stub

       if(e.getSource() == buttonCancel)

           text.setText(" ");

       else

           text.setText(text.getText()+e.getActionCommand());

      

    }

    public static void main(String arg[])

    {

       new CalculatorFrame();  

    }

}

 

//event listenerinterface implements

class WinClose implements WindowListener

{

       public void windowClosing(WindowEvent e)

{

           System.exit(0);

       }

       public void windowActivated(WindowEvent e) {}

       public void windowClosed(WindowEvent e) {}

       public void windowDeactivated(WindowEvent e) {}

       public void windowDeiconified(WindowEvent e) {}

       public void windowIconified(WindowEvent e) {}

       public void windowOpened(WindowEvent e) {}

}

//event adapter

class WinClose2 extends WindowAdapter

{

    public void windowClosing(WindowEvent e)

{

              System.exit(0);

    }

}

4. 总结

上面对事件响应做了介绍,在GUI设计中,事件响应时重中之重,上面只是对窗口事件类作了一个粗略的介绍,对其他的事件类也有类似的操作方法。

原创粉丝点击