吴志勇的博客 吴志勇的博客
  • h5

    • HTML5&CSS3
  • scss

    • css预处理语言
  • JavaScript

    • JavaScript教程
    • Ajax
    • ES6教程
    • NodeJS
    • Typescript
  • 框架

    • Jquery
    • VUE
    • React
  • Swing专题
  • java基础
  • javaweb
  • 框架
  • 数据库
  • netty
  • 设计模式
  • 微服务及架构
  • 云原生
  • maven
  • 单元测试
工具
我的
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

吴志勇

......
  • h5

    • HTML5&CSS3
  • scss

    • css预处理语言
  • JavaScript

    • JavaScript教程
    • Ajax
    • ES6教程
    • NodeJS
    • Typescript
  • 框架

    • Jquery
    • VUE
    • React
  • Swing专题
  • java基础
  • javaweb
  • 框架
  • 数据库
  • netty
  • 设计模式
  • 微服务及架构
  • 云原生
  • maven
  • 单元测试
工具
我的
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • Swing专题

    • swing图形化界面简介

    • JavaSwing布局管理器

    • JavaSwing基本组件

    • JavaSwing面板组件

    • JavaSwing其他组件

    • JavaSwing相关特性

      • 组件的位置和尺寸
      • 组件边框(Border)
      • 事件处理
      • 多线程并发与线程安全
      • 拖拽功能
      • 闪屏(SplashScreen)
      • 系统托盘(SystemTray)
    • 扩展:JavaAWTSwing其他相关

  • java基础

  • javaweb

  • 框架

  • Maven
  • 单元测试
  • 动态代理
  • 数据库

  • netty

  • 设计模式

  • 微服务及架构

  • 云原生

  • Velocity模板引擎
  • 后端
  • Swing专题
  • JavaSwing相关特性
wuzhiyong
2024-09-18

事件处理

前面介绍每个组件时,几乎都已经介绍了相应事件的使用,这里仅对常用的事件做一个小整理。

# 1. 动作监听器 — ActionListener

动作监听器的动作通常为“点击动作”,常用的组件基本都支持该事件。如果有多个组件都需要设置动作监听器,可以为它们设置同一个实例,再为组件绑定不同的动作命令(ActionCommand)来区分当前触发事件的组件。

final String COMMAND_OK = "OK";
final String COMMAND_CANCEL = "Cancel";

JButton okBtn = new JButton("OK");
okBtn.setActionCommand(COMMAND_OK);             // 按钮绑定动作命令

JButton cancelBtn = new JButton("Cancel");
cancelBtn.setActionCommand(COMMAND_CANCEL);     // 按钮绑定动作命令

// 创建一个动作监听器实例
ActionListener listener = new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        // 获取事件源,即触发事件的组件(按钮)本身
        // e.getSource();
    
        // 获取动作命令
        String command = e.getActionCommand();
        
        // 根据动作命令区分被点击的按钮
        if (COMMAND_OK.equals(command)) {
            System.out.println("OK 按钮被点击");
            
        } else if (COMMAND_CANCEL.equals(command)) {
            System.out.println("Cancel 按钮被点击");
        }
    }
};

// 设置两个按钮的动作监听器(使用同一个监听器实例)
okBtn.addActionListener(listener);
cancelBtn.addActionListener(listener);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32

# 2. 焦点监听器 — FocusListener

一个窗口内的所有组件(包括窗口本身)同一时间只能有一个组件获得焦点。

JButton btn = new JButton("OK");
btn.addFocusListener(new FocusListener() {
    @Override
    public void focusGained(FocusEvent e) {
        System.out.println("获得焦点: " + e.getSource());
    }
    @Override
    public void focusLost(FocusEvent e) {
        System.out.println("失去焦点: " + e.getSource());
    }
});

JTextField textField = new JTextField(10);
textField.addFocusListener(new FocusListener() {
    @Override
    public void focusGained(FocusEvent e) {
        System.out.println("获得焦点: " + e.getSource());
    }
    @Override
    public void focusLost(FocusEvent e) {
        System.out.println("失去焦点: " + e.getSource());
    }
});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

# 3. 鼠标监听器 — MouseListener

JPanel panel = new JPanel();

panel.addMouseListener(new MouseListener() {
    @Override
    public void mouseEntered(MouseEvent e) {
        System.out.println("鼠标进入组件区域");
    }

    @Override
    public void mouseExited(MouseEvent e) {
        System.out.println("鼠标离开组建区域");
    }

    @Override
    public void mousePressed(MouseEvent e) {
        // 获取按下的坐标(相对于组件)
        e.getPoint();
        e.getX();
        e.getY();

        // 获取按下的坐标(相对于屏幕)
        e.getLocationOnScreen();
        e.getXOnScreen();
        e.getYOnScreen();

        // 判断按下的是否是鼠标右键
        e.isMetaDown();

        System.out.println("鼠标按下");
    }

    @Override
    public void mouseReleased(MouseEvent e) {
        System.out.println("鼠标释放");
    }

    @Override
    public void mouseClicked(MouseEvent e) {
        // 鼠标在组件区域内按下并释放(中间没有移动光标)才识别为被点击
        System.out.println("鼠标点击");
    }
});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42

# 4. 鼠标移动/拖动监听器 — MouseMotionListener

JPanel panel = new JPanel();

panel.addMouseMotionListener(new MouseMotionListener() {
    @Override
    public void mouseDragged(MouseEvent e) {
        // 鼠标保持按下状态移动即为拖动
        System.out.println("鼠标拖动");
    }
    @Override
    public void mouseMoved(MouseEvent e) {
        System.out.println("鼠标移动");
    }
});
1
2
3
4
5
6
7
8
9
10
11
12
13

# 5. 鼠标滚轮监听器 — MouseWheelListener

JPanel panel = new JPanel();

panel.addMouseWheelListener(new MouseWheelListener() {
    @Override
    public void mouseWheelMoved(MouseWheelEvent e) {
        // e.getWheelRotation() 为滚轮滚动多少的度量
        System.out.println("mouseWheelMoved: " + e.getWheelRotation());
    }
});
1
2
3
4
5
6
7
8
9

# 6. 键盘监听器 — KeyListener

组件监听键盘的按键,该组件必须要获取到焦点。

如果一个窗口内没有可获取焦点的组件,一般打开窗口后焦点为窗口所有,可以把键盘监听器设置到窗口(JFrame)身上。

如果窗口内还有其他组件可获取焦点(例如按钮、文本框),窗口打开后焦点会被内部组件获得,如果想要在窗口打开期间都能监听键盘按键,可以为所有可获得焦点的组件都设置一个键盘监听器。

JFrame jf = new JFrame();

jf.addKeyListener(new KeyListener() {
    @Override
    public void keyPressed(KeyEvent e) {
        // 获取键值,和 KeyEvent.VK_XXXX 常量比较确定所按下的按键
        int keyCode = e.getKeyCode();
        System.out.println("按下: " + e.getKeyCode());
    }
    
    @Override
    public void keyTyped(KeyEvent e) {
        // e.getKeyChar() 获取键入的字符
        System.out.println("键入: " + e.getKeyChar());
    }
    
    @Override
    public void keyReleased(KeyEvent e) {
        System.out.println("释放: " + e.getKeyCode());
    }
});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

# 7. 窗口监听器 — WindowListener

窗口监听器只有窗口类组件支持,例如 JFrame、JDialog。

JFrame jf = new JFrame();

jf.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: 窗口调用 dispose 而将其关闭时调用");
    }

    @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: 窗口变为不再是活动状态时调用");
    }
});

// 窗口焦点监听器
jf.addWindowFocusListener(new WindowFocusListener() {
    @Override
    public void windowGainedFocus(WindowEvent e) {
        System.out.println("windowGainedFocus: 窗口得到焦点");
    }

    @Override
    public void windowLostFocus(WindowEvent e) {
        System.out.println("windowLostFocus: 窗口失去焦点");
    }
});

// 窗口状态监听器
jf.addWindowStateListener(new WindowStateListener() {
    @Override
    public void windowStateChanged(WindowEvent e) {
        System.out.println("windowStateChanged: " + e.getNewState());
    }
});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#swing
上次更新: 2024-09-19 12:17:39

← 组件边框(Border) 多线程并发与线程安全→

Copyright © 2020-2025 wuzhiyong
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式