ActionListener 监听事件来产生的事件

用户在窗体上对组件进行自然动作,比如鼠标点击,会出有应和的波,如ActionEvents,ChangeEvents,ItemEvents等,来响应用户之鼠标点击行为。通过兑现ActionListener接口来监听这些事件并作出处理

 

1.if语句判定是谁事件源

事件模型相关概念

  事件:描述有了什么的对象

  存在各种不同类型的波类用来描述各种类型的用户交互。

  事件源:事件的产生器。

  事件处理器:接收事件、解释事件并拍卖用户交互的方法

 

  比如以Button组件上沾击鼠标会产生为这个Button为源的一个ActionEvent,这个ActionEvent实例是一个目标,它含有关于刚才发出的充分事件之信息,这些消息包括:

  getActionCommand():返回跟动作相关联的授命名称。

  getWhen():返回事件产生的流年。

  如果用户以用户界面层执行了一个动作(鼠标点击和按键),这将招致一个事变之生。

代码示例:

 

package actionEvent;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

/**
* 在这个例子中,利用一个ActionListener来监听事件源产生的事件
* 用一些if语句来决定是哪个事件源
1. 新建一个组件(如JButton)。

2. 将该组件添加到相应的面板(如JPanel)。

3. 注册监听器以监听事件源产生的事件(如通过ActionListener来响应用户点击按钮)。

4. 定义处理事件的方法(如在ActionListener中的actionPerformed中定义相应方法)。
*/

public class ActionDemo
{
    private static JFrame jframe;
    private static JPanel jpanel;
    private JButton button1;
    private JButton button2;

    public static void main(String[] args){
        jframe=new JFrame();
        new ActionDemo();
        jframe.add(jpanel);
        jframe.pack();//根据组件大小自适应窗口大小
        jframe.setVisible(true);//窗口可显示

        //点击窗口关闭时退出应用程序
        jframe.addWindowListener(new WindowAdapter(){
            public void windowClosing(){
                System.exit(0);
            }
        });

    }

    public ActionDemo(){
        jpanel=new JPanel();//实例化面板
        button1=new JButton("按钮1");//实例化按钮
        button2=new JButton("按钮2");
        SimpleListener sl=new SimpleListener();//实例化监听类
        button1.addActionListener(sl);//添加监听给按钮
        button2.addActionListener(sl);
        jpanel.add(button1);//按钮添加到面板
        jpanel.add(button2);


    }

    private class SimpleListener implements ActionListener{
        //实现此方法,实现窗体上发生点击按钮事件后的处理
        @Override
        public void actionPerformed(ActionEvent e) {
            // TODO Auto-generated method stub
            System.out.println(e.getSource());
            String butName=e.getActionCommand();
            if(butName.equals("按钮1")){
                JOptionPane.showMessageDialog(jframe, "按钮1被点击");
            }else if(butName.equals("按钮2")){
                JOptionPane.showMessageDialog(jframe, "按钮2被点击");
            }else{
                JOptionPane.showMessageDialog(jframe, "UnKnow event");
            }
        }

    }

}

AWT事件模型

  JDK1.0底事件模型:层次模型。(已弃)

  JDK1.1或重复胜的波模型:寄托模型

  事件监听器:实现了监听器接口的近乎。一个监听器对象是一个贯彻了专门的监听器接口的类的实例。

  下面是一个概括的代码例子,说明按钮事件之监听处理。

图片 1图片 2按钮事件监听

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

public class TestButton
{
    public static void main(String[] args)
    {
        Frame frame = new Frame("Test Button");
        Button button = new Button("Press Me!");

        // 增加事件处理器
        button.addActionListener(new ButtonHandler());

        // 将按钮加入frame
        frame.add(button, BorderLayout.CENTER);

        frame.pack();

        frame.setVisible(true);
    }

}

class ButtonHandler implements ActionListener
{

    @Override
    public void actionPerformed(ActionEvent e)
    {
        //事件处理器

        System.out.println("Button is pressed!");

        String label = e.getActionCommand();
        System.out.println(label);
    }
}

 

  当单击一个按钮时,就会时有发生一个轩然大波(ActionEvent),然后检查是不是发生和拖欠按钮关联的事件处理器(实际上是一个主意),

  如果没,那么什么都不履;

  如果有的话,就会见将拖欠事件传递让与该按钮关联的事件处理器方法,作为该方法的参数,之后该事件处理方式就会自动获得调用,并且该法好应用传递过来的ActionEvent对象,进而获取事件闹时以及拖欠事件以及波起源相关联的那些信息。

  Java中之零件若想补偿加事件处理器,都见面采取形如addXxxListener()的法门来添加。一个事件源于可以长多只监听器。

 

2.经匿名内部类的法注册监听

托模型的优点

  事件非会见于飞地处理。

  有或创造并行使适配器(adapter)类对事件动作进行分拣。

  委托模型有利于把工作分布到各个类中。

代码示例:

 

package actionEvent;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

/**
 * 在这个例子中,利用一个ActionListener来监听事件源产生的事件 ,用匿名内部类的方式
 * 1. 新建一个组件(如JButton)。
 * 
 * 2. 将该组件添加到相应的面板(如JPanel)。
 * 
 * 3. 注册监听器以监听事件源产生的事件(如通过ActionListener来响应用户点击按钮)。
 * 
 * 4. 定义处理事件的方法(如在ActionListener中的actionPerformed中定义相应方法)。
 */

public class ActionDemo {
    private static JFrame jframe;
    private static JPanel jpanel;
    private JButton button1;
    private JButton button2;

    public static void main(String[] args) {
        jframe = new JFrame();
        new ActionDemo();
        jframe.add(jpanel);
        jframe.pack();// 根据组件大小自适应窗口大小
        jframe.setVisible(true);// 窗口可显示

        // 点击窗口关闭时退出应用程序
        jframe.addWindowListener(new WindowAdapter() {
            public void windowClosing() {
                System.exit(0);
            }
        });

    }

    public ActionDemo() {
        jpanel = new JPanel();// 实例化面板
        button1 = new JButton("按钮1");// 实例化按钮
        button2 = new JButton("按钮2");
        button1.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                // TODO Auto-generated method stub
                JOptionPane.showMessageDialog(jframe, "按钮1被点击");
            }

        });
        button2.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                // TODO Auto-generated method stub
                JOptionPane.showMessageDialog(jframe, "按钮2被点击");
            }

        });
        jpanel.add(button1);// 按钮添加到面板
        jpanel.add(button2);

    }

}

几类有独立代表意义之风波

  MouseEvent,鼠标事件,鼠标按下、释放、点击等。

  WindowEvent,窗口事件,点击关闭按钮,窗口取与夺焦点,窗口最小化等。

  ActionEvent,动作事件,不表示切实的动作,是一致种植语义。如按钮或菜单被鼠标单击,单行文本框中遵循下转车键等还足以看成是ActionEvent事件。

  如果用户之一个动作导致了某个组件最中心的动作来了,这即是ActionEvent事件。

  对于每类事件,都见面出一个接口(接口一般让XxxListener),这个接口要求定义一个或者多个道。想接收这事件之类似必须实现此接口,当起这些事件时,就会调用这些点子。

  关于事件处理的其他一个例:  

图片 3图片 4图形界面事件处理例子

import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Frame;
import java.awt.Label;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.sql.Date;

public class MyWindow implements MouseListener, MouseMotionListener
{
    private Frame frame;
    private Label label;
    private Button button;
    private TextField textField;

    public void go()
    {
        frame = new Frame("My Frame");
        // 加上窗口监听器,其中主要实现了退出功能
        frame.addWindowListener(new MyWindowListener());

        // 加一个标签
        label = new Label("This is my Window");
        frame.add(label, BorderLayout.NORTH);

        // 加一个按钮
        button = new Button("MyButton");
        frame.add(button, BorderLayout.WEST);

        // 设置按钮事件监听器,按钮按下时会向控制台输出信息
        button.addActionListener(new MyButtonListener());

        // 加一个文本编辑框
        textField = new TextField(40);
        frame.add(textField, BorderLayout.SOUTH);

        // 加上鼠标动作监听器,因为类本身实现了这两个接口,所以参数是this
        frame.addMouseListener(this);
        frame.addMouseMotionListener(this);
        // 可以添加多个监听器,所以还可以定义其他的,如MyMouseListener类,然后加上

        // 设置刚好能容纳这些控件的尺寸
        frame.pack();
        // 设置为可见
        frame.setVisible(true);
    }

    public static void main(String[] args)
    {
        MyWindow window = new MyWindow();

        window.go();
    }

    @Override
    public void mouseDragged(MouseEvent e)
    {

    }

    @Override
    public void mouseMoved(MouseEvent e)
    {
        String str = "x = " + e.getX() + ", y = " + e.getY();
        this.textField.setText(str);
        System.out.println(str);
    }

    @Override
    public void mouseClicked(MouseEvent e)
    {

    }

    @Override
    public void mouseEntered(MouseEvent e)
    {

    }

    @Override
    public void mouseExited(MouseEvent e)
    {
        this.textField.setText("the mouse has exited.");
    }

    @Override
    public void mousePressed(MouseEvent e)
    {

    }

    @Override
    public void mouseReleased(MouseEvent e)
    {

    }

}

class MyButtonListener implements ActionListener
{

    @SuppressWarnings("deprecation")
    @Override
    public void actionPerformed(ActionEvent e)
    {
        // 输出信息
        System.out.println("The Button is pressed!");

        // 输出时间戳
        Long time = e.getWhen();
        System.out.println("timestamp: " + time);

        // 日期时间
        Date date = new Date(time);
        System.out.println(date.toLocaleString());

    }

}

class MyWindowListener implements WindowListener
{

    @Override
    public void windowActivated(WindowEvent e)
    {

    }

    @Override
    public void windowClosed(WindowEvent e)
    {

    }

    @Override
    public void windowClosing(WindowEvent e)
    {
        System.out.println("windowClosing");
        // 退出
        System.exit(0);
    }

    @Override
    public void windowDeactivated(WindowEvent e)
    {

    }

    @Override
    public void windowDeiconified(WindowEvent e)
    {

    }

    @Override
    public void windowIconified(WindowEvent e)
    {

    }

    @Override
    public void windowOpened(WindowEvent e)
    {

    }
}

 

 

3.让每一个零件创建一个监听器

参考资料

  张龙先生Java SE视频教程。

  本博客相关文章:

  http://www.cnblogs.com/mengdd/archive/2012/09/08/2676587.html

 

代码示例:

package actionEvent;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

/**
 * 在这个例子中,利用一个ActionListener来监听事件源产生的事件 ,给每个组件建立一个监听
 * 1. 新建一个组件(如JButton)。
 * 
 * 2. 将该组件添加到相应的面板(如JPanel)。
 * 
 * 3. 注册监听器以监听事件源产生的事件(如通过ActionListener来响应用户点击按钮)。
 * 
 * 4. 定义处理事件的方法(如在ActionListener中的actionPerformed中定义相应方法)。
 */

public class ActionDemo {
    private static JFrame jframe;
    private static JPanel jpanel;
    private JButton button1;
    private JButton button2;

    public static void main(String[] args) {
        jframe = new JFrame();
        new ActionDemo();
        jframe.add(jpanel);
        jframe.pack();// 根据组件大小自适应窗口大小
        jframe.setVisible(true);// 窗口可显示

        // 点击窗口关闭时退出应用程序
        jframe.addWindowListener(new WindowAdapter() {
            public void windowClosing() {
                System.exit(0);
            }
        });

    }

    public ActionDemo() {
        jpanel = new JPanel();// 实例化面板
        button1 = new JButton("按钮1");// 实例化按钮
        button2 = new JButton("按钮2");
        button1.addActionListener(new but1Listener());
        button2.addActionListener(new but2Listener());
        jpanel.add(button1);// 按钮添加到面板
        jpanel.add(button2);

    }

    private class but1Listener implements ActionListener{

        @Override
        public void actionPerformed(ActionEvent e) {
            // TODO Auto-generated method stub
            JOptionPane.showMessageDialog(jframe, "按钮1被点击");
        }

    }
    private class but2Listener implements ActionListener{

        @Override
        public void actionPerformed(ActionEvent e) {
            // TODO Auto-generated method stub
            JOptionPane.showMessageDialog(jframe, "按钮2被点击");
        }

    }

}

小结:这几种方法各出优缺,但其实差异不杀,具体用啊种根据程序复杂度以及现实状况而自然

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图