Java学习笔记——Java 事件处理

  • 事件的基本原理

  1. 事件必须用一个对象封装。

点击按钮,系统自动将发出的事件封装在 java.awt.event.ActionEvent 对象内。

  1. 事件的处理者必须具有监听事件的能力。

在 java 中,ActionEvent 是由 java.awt.event.ActionListener 监听的。 因此,此步骤中,我们需要编写一个事件处理类,来实现ActionListener 接口。

  1. 事件的处理者必须编写事件处理函数。

在 java 中,实现一个接口,必须将接口中的函数重写一遍,该函数就是事件处理函数。查看文档,可以找到ActionListener 中定义的函数:
void actionPerformed(ActionEvent e)
对其进行重写并编写事件处理代码

  1. 必须将事件的发出者和事件的处理者对象绑定起来。

public void addActionListener(ActionListener l)

例子:
package event; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.JButton; 
import javax.swing.JFrame;
public class EventTest2 extends JFrame{
    private JButton btHello = new JButton("按钮");
    public EventTest2(){ this.add(btHello); //绑定 
    btHello.addActionListener(new ButtonClickOpe()); 
    //必须规定按钮点击,发出的事件由 ButtonClickOpe 对象处理
    this.setSize(30,50); 
    this.setVisible(true);
}
    public static void main(String[] args) { 
          new EventTest2();
    }
}
class ButtonClickOpe implements ActionListener { 
     public void actionPerformed(ActionEvent e) { 
         System.out.println("Hello");
    }
}
image.png

  • 处理ActionEvent

在 java.awt.event 包中,ActionEvent 是最常用的一种事件。一般情况下,
ActionEvent 适合于对某些控件的单击(也有特殊情况)。常见发出 ActionEvent 的场合 如下:
1.JButton、JComboBox、JMenu、JMenuItem、控件的的单击。
2.javax.swing.Timer 发出的事件。
3.在 JTextField 等控件上按下回车、JButton 等控件上按下空格(相当于点击效果)
等。ActionEvent 用ActionListener 监听。其编程方法,采用上节流程即可。

以下案例中,界面上包含一个下拉列表框,选择界面颜色,当选择之后,能够将界面背景自动变成相应颜色:
package actionevent; 
import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener; 
import javax.swing.JComboBox; 
import javax.swing.JFrame;
public class ActionEventTest1 extends JFrame implements ActionListener {
    private JComboBox cbColor = new JComboBox();

    public ActionEventTest1() {
        this.add(cbColor, BorderLayout.NORTH);
        cbColor.addItem("红");
        cbColor.addItem("绿");
        cbColor.addItem("蓝");
        cbColor.addActionListener(this);
        this.setSize(30, 100);
        this.setVisible(true);
    }

    public void actionPerformed(ActionEvent e) {
        Object color = cbColor.getSelectedItem();
        if (color.equals("红")) {
            this.getContentPane().setBackground(Color.red);
        } else if (color.equals("绿")) {
            this.getContentPane().setBackground(Color.green);
        } else {
            this.getContentPane().setBackground(Color.blue);
        }
    }

    public static void main(String[] args) {
        new ActionEventTest1();
    }
}
image.png

  • 处理 FocusEvent

在 java.awt.event 包中,FocusEvent 也经常使用。一般情况下,FocusEvent 适合
于对某些控件 Component 获得或失去输入焦点时,需要处理的场合。FocusEvent 用 java.awt.event.FocusListener 接口监听。该接口中有如下函数:
1.void focusGained(FocusEvent e):组件获得焦点时调用。
2.void focusLost(FocusEvent e):组件失去焦点时调用。

以下案例中,界面上有一个文本框,要求,该文本框失去焦点时,内部显示:请您输入账号;当得到焦点时,该提示消失。代码如下:
package focusevent;

import java.awt.FlowLayout;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextField;

public class FocusEventTest1 extends JFrame implements FocusListener {
    private JButton btOK = new JButton("确定");
    private JTextField tfAcc = new JTextField("请您输入账号", 10);

    public FocusEventTest1() {
        this.setLayout(new FlowLayout());
        this.add(btOK);
        this.add(tfAcc);
        tfAcc.addFocusListener(this);// 绑定 
        this.setSize(200,80); 
        this.setVisible(true);
    }

    public void focusGained(FocusEvent arg0) {
        tfAcc.setText("");
    }

    public void focusLost(FocusEvent arg0) {
        tfAcc.setText("请您输入账号");
    }

    public static void main(String[] args) {
        new FocusEventTest1();
    }
}
image.png

image.png
  • 处理KeyEvent

在 java.awt.event 包中,KeyEvent 也经常使用。一般情况下,KeyEvent 适合于在 某个控件上进行键盘操作时,需要处理事件的场合。 KeyEvent 用 java.awt.event.KeyListener 接口监听。该接口中有如下函数: 1. void keyTyped(KeyEvent e):键入某个键时调用此方法。 2. void keyPressed(KeyEvent e):按下某个键时调用此方法。 3. void keyReleased(KeyEvent e):释放某个键时调用此方法。

  • 处理MouseEvent

在 java.awt.event 包中,MouseEvent 也经常使用。一般情况下,MouseEvent 在以 下情况下发生:
1.鼠标事件。 鼠标事件包括按下鼠标按键、释放鼠标按键、单击鼠标按键(按下并释放)、鼠 标光标进入组件几何形状的未遮掩部分、鼠标光标离开组件几何形状的未遮掩部分。 此时,MouseEvent 用 java.awt.event.MouseListener 接口监听。该接口中有如下函数:
(1)void mouseClicked(MouseEvent e):鼠标按键在组件上单击(按下并释放)时调用。 (2) void mousePressed(MouseEvent e):鼠标按键在组件上按下时调用。
(3) void mouseReleased(MouseEvent e):鼠标按钮在组件上释放时调用。
(4) void mouseEntered(MouseEvent e):鼠标进入到组件上时调用。
(5) void mouseExited(MouseEvent e):鼠标离开组件时调用。
2.鼠标移动事件 鼠标移动事件,包括移动鼠标和拖动鼠标。此时,MouseEvent 用
java.awt.event.MouseMotionListener 接口监听。该接口中有如下函数:
(1) void mouseDragged(MouseEvent e):鼠标拖动时调用。
(2) void mouseMoved(MouseEvent e):鼠标移动时调用。

下面用一个程序进行鼠标事件测试,鼠标在 JFrame 上按下,将该处坐标设置为界面标题。代码如下:
package mouseevent;

import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JFrame;

public class MouseEventTest1 extends JFrame implements MouseListener {
    public MouseEventTest1() {
        this.addMouseListener(this);
        this.setSize(300, 100);
        this.setVisible(true);
    }

    public void mouseClicked(MouseEvent e) {
        this.setTitle("鼠标点击:(" + e.getX() + "," + e.getY() + ")");
    }

    public void mouseEntered(MouseEvent arg0) {
    }

    public void mouseExited(MouseEvent arg0) {
    }

    public void mousePressed(MouseEvent arg0) {
    }

    public void mouseReleased(MouseEvent arg0) {
    }

    public static void main(String[] args) {
        new MouseEventTest1();
    }
}
image.png
  • 处理WindowEvent

在 java.awt.event 包中,WindowEvent 也经常使用。一般情况下,WindowEvent
适合窗口状态改变,如打开、关闭、激活、停用、图标化或取消图标化时,需要处理 事件的场合。WindowEvent 一般用 java.awt.event.WindowListener 接口监听。该接口中 有如下函数:
1.void windowOpened(WindowEvent e):窗口首次变为可见时调用。
2.void windowClosing(WindowEvent e):用户试图从窗口的系统菜单中关闭窗口时
调用。
3.void windowClosed(WindowEvent e):因对窗口调用 dispose 而将其关闭时调用。 4.void windowIconified(WindowEvent e) :窗口从正常状态变为最小化状态时调用。 5.void windowDeiconified(WindowEvent e):窗口从最小化状态变为正常状态时调
用。
6.void windowActivated(WindowEvent e):将Window 设置为活动 Window 时调用。 7.void windowDeactivated(WindowEvent e):当Window不再是活动Window时调用。

下面用一个程序进行测试,在一个按下窗口上的关闭键,询问用户是否关闭该窗口。代码如下:
package windowevent;

import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import javax.swing.JFrame;
import javax.swing.JOptionPane;

public class WindowEventTest1 extends JFrame implements WindowListener {
    public WindowEventTest1() { // 设置关闭时默认不做任何事 this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
                                // this.addWindowListener(this); this.setSize(200,80); this.setVisible(true);
    }

    public void windowClosing(WindowEvent arg0) {
        int result = JOptionPane.showConfirmDialog(this, "您确认关闭吗?", "确认", JOptionPane.YES_NO_OPTION);
        if (result == JOptionPane.YES_OPTION) {
            System.exit(0);
        }
    }

    public void windowActivated(WindowEvent arg0) {
    }

    public void windowClosed(WindowEvent arg0) {
    }

    public void windowDeactivated(WindowEvent arg0) {
    }

    public void windowDeiconified(WindowEvent arg0) {
    }

    public void windowIconified(WindowEvent arg0) {
    }

    public void windowOpened(WindowEvent arg0) {
    }

    public static void main(String[] args) {
        new WindowEventTest1();
    }
}
  • 使用Adapter 简化开发

在前面的例子中,KeyEvent、MouseEvent、WindowEvent 的处理中,不约而同遇 到了一个问题:Listener 接口中的函数个数较多,但是经常我们只用到一两个,由于 实现一个接口,必须将接口中的函数重写一遍,因此,造成大量的空函数,用不着, 不写又不行。
能否解决这个问题呢?我们知道,实现一个接口,必须将接口中的函数重写一遍, 但是继承一个类,并不一定将类中的函数重写一遍,因此,java中提供了相应的Adapter 类来帮我们简化这个操作。 常见的Adapter 类有:
1.KeyAdapter:内部函数和KeyListener 基本相同。
2.MouseAdapter:内部函数和MouseListener、MouseMotionListener 基本相同。
3.WindowAdapter:内部函数和WindowListener 基本相同。

package windowadapter;

import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JFrame;
import javax.swing.JOptionPane;

public class WindowAdapterTest1 extends JFrame {
    public WindowAdapterTest1() { // 设置关闭时不做任何事 this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
                                    // this.addWindowListener(new WindowOpe()); this.setSize(200,80);
                                    // this.setVisible(true);
    }

    public static void main(String[] args) {
        new WindowAdapterTest1();
    }

    class WindowOpe extends WindowAdapter {
        public void windowClosing(WindowEvent arg0) {
            int result = JOptionPane.showConfirmDialog(null, "您确认关闭吗?", "确认", JOptionPane.YES_NO_OPTION);
            if (result == JOptionPane.YES_OPTION) {
                System.exit(0);
            }
        }
    }
}

你可能感兴趣的:(Java学习笔记——Java 事件处理)