菜单

ActionListener 监听事件起点爆发的风波

2018年12月15日 - Java

用户以窗体上对组件举行定动作,比如鼠标点击,会有一些遥相呼应的轩然大波,如Action伊夫(Eve)nts,Change伊芙(Eve)nts,Item伊夫nts等,来响应用户之鼠标点击行为。通过落实ActionListener接口来监听那些事件并作出处理

 

1.if语句判断是何人事件源

事件模型相关概念

  事件:描述来了呀的对象

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

  事件源:事件的暴发器。

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

 

  比如当Button组件上点击鼠标会暴发为之Button为源的一个ActionEvent,那几个Action伊夫(Eve)nt实例是一个对象,它包含关于刚才时有暴发的不胜事件之信息,那多少个信包括:

  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);
    }
}

 

  当单击一个按钮时,就相会有一个风波(Action伊夫nt),然后检查是否发跟拖欠按钮关联的事件处理器(实际上是一个办法),

  假使无,那么什么都未实施;

  假诺有的话,就会师将该事件传递让与该按钮关联的事件处理器方法,作为该措施的参数,之后该事件处理措施就会自行取调用,并且该办法可以使用传递过来的Action伊芙nt对象,进而赢得事件暴发常跟该事件及波源于相关联的这么些信息。

  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,动作事件,不表示切实的动作,是同样种语义。如按钮或菜单被鼠标单击,单行文本框中遵照下转车键等仍是可以够看作是Action伊芙(Eve)nt事件。

  假诺用户之一个动作导致了某组件最基本的动作来了,这即便是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地图