P39 事件处理
- 1.事件模型的流程
- 2.事件监听器
- 2.1 动作监听器(ActionListener)
- 2.2 焦点监听器(FocusListener)
- 2.3 鼠标监听器(MouseListener)
- 2.4 鼠标移动/拖动监听器(MouseMotionListener)
- 2.5 鼠标滚轮监听器(MouseWheelListener)
- 2.6 键盘监听器(KeyListener)
- 2.7 窗口监听器(WindowListener)
系统:Win10
Java:1.8.0_333
IDEA:2020.3.4
Gitee:https://gitee.com/lijinjiang01/JavaSwing
1.事件模型的流程
为了使图形界面能够接收用户的操作,必须给各个组件加上事件处理机制。
在事件处理的过程中,主要涉及三类对象
Event Source(事件源):事件发生的场所,通常就是各个组件,例如按钮、窗口、菜单等
Event(事件):事件封装了 GUI 组件上发生的特定事情(通常就是一次用户操作)。如果程序需要获取 GUI 组件上所发生事件的相关信息,都通过 Event 对象来获取
Event Listener(事件监听器):负责监听事件源所发生的事件,并对各种事件做出相应处理
事件流程处理示意图:
2.事件监听器
事件机制涉及三个成员:事件源、事件和事件监听器,其中事件源使最容易创建的,只需要通过 new 来创建一个组件即可,该组件就是事件源:事件是由系统自动产生的,无需程序员关心。所以实现事件监听器就是整个事件处理的核心
2.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() {@Overridepublic 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);
2.2 焦点监听器(FocusListener)
一个窗口内的所有组件(包括窗口本身)同一时间只能有一个组件获得焦点。
JButton btn = new JButton("OK");
btn.addFocusListener(new FocusListener() {@Overridepublic void focusGained(FocusEvent e) {System.out.println("获得焦点: " + e.getSource());}@Overridepublic void focusLost(FocusEvent e) {System.out.println("失去焦点: " + e.getSource());}
});JTextField textField = new JTextField(10);
textField.addFocusListener(new FocusListener() {@Overridepublic void focusGained(FocusEvent e) {System.out.println("获得焦点: " + e.getSource());}@Overridepublic void focusLost(FocusEvent e) {System.out.println("失去焦点: " + e.getSource());}
});
2.3 鼠标监听器(MouseListener)
JPanel panel = new JPanel();panel.addMouseListener(new MouseListener() {@Overridepublic void mouseEntered(MouseEvent e) {System.out.println("鼠标进入组件区域");}@Overridepublic void mouseExited(MouseEvent e) {System.out.println("鼠标离开组建区域");}@Overridepublic void mousePressed(MouseEvent e) {// 获取按下的坐标(相对于组件)e.getPoint();e.getX();e.getY();// 获取按下的坐标(相对于屏幕)e.getLocationOnScreen();e.getXOnScreen();e.getYOnScreen();// 判断按下的是否是鼠标右键e.isMetaDown();System.out.println("鼠标按下");}@Overridepublic void mouseReleased(MouseEvent e) {System.out.println("鼠标释放");}@Overridepublic void mouseClicked(MouseEvent e) {// 鼠标在组件区域内按下并释放(中间没有移动光标)才识别为被点击System.out.println("鼠标点击");}
});
2.4 鼠标移动/拖动监听器(MouseMotionListener)
JPanel panel = new JPanel();panel.addMouseMotionListener(new MouseMotionListener() {@Overridepublic void mouseDragged(MouseEvent e) {// 鼠标保持按下状态移动即为拖动System.out.println("鼠标拖动");}@Overridepublic void mouseMoved(MouseEvent e) {System.out.println("鼠标移动");}
});
2.5 鼠标滚轮监听器(MouseWheelListener)
JPanel panel = new JPanel();panel.addMouseWheelListener(new MouseWheelListener() {@Overridepublic void mouseWheelMoved(MouseWheelEvent e) {// e.getWheelRotation() 为滚轮滚动多少的度量System.out.println("mouseWheelMoved: " + e.getWheelRotation());}
});
2.6 键盘监听器(KeyListener)
组件监听键盘的按键,该组件必须要获取到焦点。
如果一个窗口内没有可获取焦点的组件,一般打开窗口后焦点为窗口所有,可以把键盘监听器设置到窗口(JFrame)身上。
如果窗口内还有其他组件可获取焦点(例如按钮、文本框),窗口打开后焦点会被内部组件获得,如果想要在窗口打开期间都能监听键盘按键,可以为所有可获得焦点的组件都设置一个键盘监听器。
JFrame frame = new JFrame();frame.addKeyListener(new KeyListener() {@Overridepublic void keyPressed(KeyEvent e) {// 获取键值,和 KeyEvent.VK_XXXX 常量比较确定所按下的按键int keyCode = e.getKeyCode();System.out.println("按下: " + e.getKeyCode());}@Overridepublic void keyTyped(KeyEvent e) {// e.getKeyChar() 获取键入的字符System.out.println("键入: " + e.getKeyChar());}@Overridepublic void keyReleased(KeyEvent e) {System.out.println("释放: " + e.getKeyCode());}
});
2.7 窗口监听器(WindowListener)
窗口监听器只有窗口类组件支持,例如 JFrame、JDialog。
JFrame frame = new JFrame();frame.addWindowListener(new WindowListener() {@Overridepublic void windowOpened(WindowEvent e) {System.out.println("windowOpened: 窗口首次变为可见时调用");}@Overridepublic void windowClosing(WindowEvent e) {System.out.println("windowClosing: 用户试图从窗口的系统菜单中关闭窗口时调用");}@Overridepublic void windowClosed(WindowEvent e) {System.out.println("windowClosed: 窗口调用 dispose 而将其关闭时调用");}@Overridepublic void windowIconified(WindowEvent e) {System.out.println("windowIconified: 窗口从正常状态变为最小化状态时调用");}@Overridepublic void windowDeiconified(WindowEvent e) {System.out.println("windowDeiconified: 窗口从最小化状态变为正常状态时调用");}@Overridepublic void windowActivated(WindowEvent e) {System.out.println("windowActivated: 窗口变为活动状态时调用");}@Overridepublic void windowDeactivated(WindowEvent e) {System.out.println("windowDeactivated: 窗口变为不再是活动状态时调用");}
});// 窗口焦点监听器
frame.addWindowFocusListener(new WindowFocusListener() {@Overridepublic void windowGainedFocus(WindowEvent e) {System.out.println("windowGainedFocus: 窗口得到焦点");}@Overridepublic void windowLostFocus(WindowEvent e) {System.out.println("windowLostFocus: 窗口失去焦点");}
});// 窗口状态监听器
frame.addWindowStateListener(new WindowStateListener() {@Overridepublic void windowStateChanged(WindowEvent e) {System.out.println("windowStateChanged: " + e.getNewState());}
});