Swing组件中的事件处理专门用于响应用户的操作,例如,响应用户的单击鼠标、按下键盘等操作。
事件发生的场所,通常就是产生事件的组件,例如窗口、按钮、菜单等。
封装了GUI组件上发生的特定事件(通常就是用户的一次操作)。
负责监听事件源上发生的事件,并对各种事件做出相应处理的对象(对象中包含事件处理器)。
事件源是一个组件,当用户进行一些操作时,如按下鼠标或者释放键盘等,都会触发相应的事件,如果事件源注册了监听器,则触发的相应事件将会被处理。
除了一些常见的按钮、键盘等组件可以作为事件源外,包括JFrame窗口在内的顶级容器也可以作为事件源。
根据要监听的事件源创建指定类型的监听器进行事件处理,该监听器是一个特殊的Java类,必须实现XxxListener接口(根据组件触发的动作进行区分,如WindowListener用于监听窗口事件,ActionListener用于监听动作事件)。然后重写接口的事件处理方法,实现相应的具体功能。
使用addXxxListener()方法为指定事件源添加特定类型的监听器。当事件源上发生监听的事件后,就会触发绑定的事件监听器,然后由监听器中的方法进行相应处理。
// 给【取消】按钮注册动作监听器
btnCancel.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// 退出应用程序
System.exit(0);
}
});
// 给【登录】按钮注册动作监听器
btnLogin.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// 获取用户输入的用户名与密码
String username = txtUsername.getText().toString();
String password = new String(txtPassword.getPassword());
// 判断用户输入的用户名与密码是否正确(假定用户名和密码都是admin)
if (username.equals("admin")) {
if (password.equals("admin")) {
JOptionPane.showMessageDialog(LoginFrame.this,
"欢迎登录系统!", "提示信息", JOptionPane.INFORMATION_MESSAGE);
LoginFrame.this.dispose(); // 关闭登录窗口
} else {
JOptionPane.showMessageDialog(LoginFrame.this,
"密码有错误!", "提示信息", JOptionPane.ERROR_MESSAGE);
txtPassword.requestFocus(); // 让密码文本框获取焦点
txtPassword.selectAll(); // 选中密码全部文本
}
} else {
JOptionPane.showMessageDialog(LoginFrame.this,
"用户名有错误!", "提示信息", JOptionPane.ERROR_MESSAGE);
txtUsername.requestFocus(); // 让用户名文本框获取焦点
txtUsername.selectAll(); // 选中用户名全部文本
}
}
});
对窗体进行操作时,例如窗体的打开、关闭、激活、停用等,这些动作都属于窗体事件。Java中提供了一个WindowEvent
类用于表示窗体事件。
首先需要定义一个实现了WindowListener接口的类作为窗体监听器,然后通过addWindowListener()方法将窗体对象与窗体监听器进行绑定。
package net.hw.lesson30;
import javax.swing.*;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
/**
* 功能:演示窗体事件
* 作者:华卫
* 日期:2020年05月30日
*/
public class WindowEventDemo extends JFrame {
public static void main(String[] args) {
// 创建窗口对象
JFrame frame = new JFrame("演示窗体事件");
// 设置窗口属性
frame.setSize(400, 300);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 给窗口注册监听器
frame.addWindowListener(new WindowListener() {
@Override
public void windowOpened(WindowEvent e) {
System.out.println("windowOpened--窗体打开事件");
}
@Override
public void windowClosing(WindowEvent e) {
System.out.println("windowClosing--窗体正在关闭事件");
}
@Override
public void windowClosed(WindowEvent e) {
System.out.println("windowClosed--窗体已关闭事件");
}
@Override
public void windowIconified(WindowEvent e) {
System.out.println("windowIconified--窗体图标化事件");
}
@Override
public void windowDeiconified(WindowEvent e) {
System.out.println("windowDeiconified--窗体取消图标化事件");
}
@Override
public void windowActivated(WindowEvent e) {
System.out.println("windowActivated--窗体激活事件");
}
@Override
public void windowDeactivated(WindowEvent e) {
System.out.println("windowDeactivated--窗体停用事件");
}
});
}
}
用户会经常使用鼠标来进行选择、切换界面等操作,这些操作被定义为鼠标事件,其中包括鼠标按下、鼠标松开、鼠标单击等。Java中提供了一个MouseEvent
类用于表示鼠标事件。几乎所有的组件都可以产生鼠标事件。
首先需要通过实现MouseListener接口定义监听器(也可以通过继承适配器MouseAdapter类来实现),然后调用addMouseListener()方法将监听器绑定到事件源对象。
package net.hw.lesson30;
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
/**
* 功能:演示鼠标事件
* 作者:华卫
* 日期:2020年05月30日
*/
public class MouseEventDemo {
public static void main(String[] args) {
// 创建窗口对象
JFrame frame = new JFrame("演示鼠标事件");
// 设置窗口边界
frame.setBounds(200, 200, 300, 200);
// 设置屏幕居中(采用相对定位方式)
frame.setLocationRelativeTo(null);
// 设置窗口布局
frame.setLayout(new FlowLayout());
// 创建按钮对象
JButton btnTest = new JButton("测试按钮");
// 将按钮添加到窗口
frame.add(btnTest);
// 设置窗口可见
frame.setVisible(true);
// 设置默认关闭方式(关闭窗口就退出应用程序)
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 给按钮注册鼠标监听器
btnTest.addMouseListener(new MouseListener() {
@Override
public void mouseClicked(MouseEvent e) {
System.out.println("mouseClicked--鼠标完成单击事件");
}
@Override
public void mousePressed(MouseEvent e) {
System.out.println("mousePressed--鼠标按下事件");
}
@Override
public void mouseReleased(MouseEvent e) {
System.out.println("mouseReleased--鼠标放开事件");
}
@Override
public void mouseEntered(MouseEvent e) {
System.out.println("mouseEntered--鼠标进入按钮区域事件");
}
@Override
public void mouseExited(MouseEvent e) {
System.out.println("mouseExited--鼠标移出按钮区域事件");
}
});
}
}
键盘操作也是最常用的用户交互方式,例如键盘按下、释放等,这些操作被定义为键盘事件。Java中提供了一个KeyEvent类表示键盘事件。
处理键盘事件的监听器对象需要实现KeyListener接口或者继承KeyAdapter类;然后调用addKeyListener()方法将监听器绑定到事件源对象。
package net.hw.lesson30;
import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
/**
* 功能:演示按键事件
* 作者:华卫
* 日期:2020年05月30日
*/
public class KeyEventDemo {
public static void main(String[] args) {
// 创建窗口对象
JFrame frame = new JFrame("演示按键事件");
// 设置窗口边界
frame.setBounds(200, 200, 300, 200);
// 设置屏幕居中(采用相对定位方式)
frame.setLocationRelativeTo(null);
// 设置窗口布局
frame.setLayout(new FlowLayout());
// 创建文本框对象
JTextField txtTest = new JTextField(15);
// 将文本框添加到窗口
frame.add(txtTest);
// 设置窗口可见
frame.setVisible(true);
// 设置默认关闭方式(关闭窗口就退出应用程序)
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 给文本框注册按键监听器
txtTest.addKeyListener(new KeyListener() {
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void keyPressed(KeyEvent e) {
// 获取按键字符
char keyChar = e.getKeyChar();
// 获取按键字符的键码
int keyCode = e.getKeyCode();
System.out.println("按键字符:" + keyChar + "\t按键代码:" + keyCode);
}
@Override
public void keyReleased(KeyEvent e) {
}
});
}
}
动作事件与前面三种事件有所不同,它不代表某类事件,只是表示一个动作发生了。例如,在关闭一个文件时,可以通过键盘关闭,也可以通过鼠标关闭。在Java中,动作事件用ActionEvent
类表示。
处理动作事件的监听器对象需要实现ActionListener接口,然后调用addActionListener()方法将监听器绑定到事件源对象。