Java GUI学习之入门2
1、java的事件处理机制理解
一个java gui程序有窗口JFrame或对话框JDialog,一系列中间面板用于对顶级容器进行划分并用于放置各类基本组件,基本组件通过事件和监听器实现各种功能。Java通过事件监听机制进行gui交互处理,java的事件监听机制作用是:为节省资源系统不对某个事件进行实时监听,需要当某事件发生时(进行事件发布)处理代码被自动运行。 所有顶级组件和基础组件都有自己的一种或多种事件,如果组件的事件有监听器接受就被执行,否则被放弃。
Java的事件机制的参与者有4中角色:事件源类event source,监听类event listener,事件监听者接口event listener interface,事件类event object。
事件源类描述事件源的基本属性和行为,比如按钮的形状、颜色、点击操作等。
事件类描述某个事件的所有属性和行为,比如键盘事件类KeyEvent描述键盘是否被按下、是否,键码,是否有组合键等。
事件监听器类listener,是事件的主题类,当事件发生后,该类负责进行相关事件的处理,实现具体功能。为了接受并处理某个事件类型,组件(事件源)必须注册相应的事件处理程序(即事件监听器类)。
事件监听器接口,负责将事件源的相关信息传递给对应的监听者,事件监听者接口负责定义这样的接口规范。
事件表示一个组件的状态发生了变化,比如,按钮被按下时就会产生一个事件。如果没有能够接受和处理事件的对象,图形界面生成的一切事件都是无用的,这些事件接受者称为事件监听器。通常,在监听器内实现事件的具体方法,也就是说,为了实现事件方法,需要设计事件监听类,这些类继承java提供的接口或各种适配器,然后在子类内实现具体的事件处理方法。在Java中,由于应用接口必须在应用的类中实现接口中的所有申明函数,有时对于不需要使用所有申明函数的监听者比较麻烦,所以通常可以编写一个基础的适配器类来应用接口,适配器中预先实现所有的空接口函数,监听者则通过继承适配器并重载自己需要的接口函数来避免直接应用接口的麻烦。
Java的3种事件处理方式:(1)使用接口,(2)定义一个类,使用事件适配器,(3)使用匿名内部欸。如果关注全部事件,采用监听器接口方法;如果关注特定的几个事件,采用事件适配器方法;如果某个事件处理只被使用一次,且事件很少,可以不用写在事件监听类中,通过匿名内部类来实现即可。采用后两种方法,即使用适配器操作类或直接编写匿名内部类可以减少事件监听类的定义,可以提高开发效率。
2、事件处理的主要步骤
(1)首先产生监听器,监听是否有事件源的产生。
(2)在要实现具有事件处理功能的组件上注册监听器。事件源对象.addXXXListener(XXXListener)
(3)注册监听器的组件产生事件源,并将事件对象返回给监听器。
(4)有监听器调用相应的方法处理事件。
3、java常用的事件类型
Java将所有组件的事件进行分类,具有共同特征的事件被抽象为一个事件类AWTEvent,这些事件的类型有:动作事件类ActionEvent,窗口事件类,文本事件类,键盘事件类,鼠标事件类,选择事件类,焦点事件类,容器事件类,组件事件类等。各事件类的接口和方法如下:
事件类/接口名称 | 接口方法及说明 |
ActionEvent动作事件类 ActionListener接口 | actionPerformed(ActionEvent e) 单击按钮、选择菜单项或在文本框中按回车时 |
AdjustmentEvent调整事件类 AdjustmentListener接口 | adjustmentValueChanged(AdjustmentEvent e) 当改变滚动条滑块位置时 |
ComponentEvent组件事件类 ComponentListener接口 | componentMoved(ComponentEvent e)组件移动时 componentHidden(ComponentEvent e)组件隐藏时 componentResized(ComponentEvent e)组件缩放时 componentShown(ComponentEvent e)组件显示时 |
ContainerEvent容器事件类 ContainerListener接口 | componentAdded(ContainerEvent e)添加组件时 componentRemoved(ContainerEvent e) 移除组件时 |
FocusEvent焦点事件类 FocusListener接口 | focusGained(FocusEvent e)组件获得焦点时 focusLost(FocusEvent e)组件失去焦点时 |
ItemEvent选择事件类 ItemListener接口 | itemStateChanged(ItemEvent e) 选择复选框、选项框、单击列表框、选中带复选框菜单时 |
KeyEvent键盘事件类 KeyListener接口 | keyPressed(KeyEvent e)键按下时 keyReleased(KeyEvent e) 键释放时 keyTyped(KeyEvent e)击键时 |
MouseEvent鼠标事件类 MouseListener接口 | mouseClicked(MouseEvent e) 单击鼠标时 mouseEntered(MouseEvent e)鼠标进入时 mouseExited(MouseEvent e)鼠标离开时 mousePressed(MouseEvent e)鼠标键按下时 mouseReleased(MouseEvent e) 鼠标键释放时 |
MouseEvent鼠标移动事件类 MouseMotionListener接口 | mouseDragged(MouseEvent e)鼠标拖放时 mouseMoved(MouseEvent e)鼠标移动时 |
MouseWheelEvent 鼠标滚动事件 MouseWheelEventListener接口 | mouseWheelMoved(mouseWheelMoved e)鼠标滚动时 getwheelrotation(),getScrollAmount |
TextEvent文本事件类 TextListener接口 | textValueChanged(TextEvent e) 文本框、多行文本框内容修改时 |
WindowEvent窗口事件类 WindowListener接口 | windowOpened(WindowEvent e)窗口打开后 windowClosed(WindowEvent e)窗口关闭后 windowClosing(WindowEvent e)窗口关闭时 windowActivated(WindowEvent e)窗口激活时 windowDeactivated(WindowEvent e) 窗口失去焦点时 windowIconified(WindowEvent e)窗口最小化时 windowDeiconified(WindowEvent e) 最小化窗口还原时 |
(1)窗体事件
WindowLinstener是专门处理窗体的事件监听接口,一个窗体的所有事件,都可以用这个接口进行监听。如果只对某种窗口事件感兴趣,就没有必要通过实现接口的方式来监听事件,(因为通过接口的方法需要实现事件监听接口windowlistener的所有方法)。解决这个问题,需要采用适配器设计模式,在实现类和接口之间增加一个过渡的抽象类,java在整个事件处理中提供了很多适配器类Adapter,方便用户进行事件处理的实现。比如,WindowAdapter,只需要继承该类,子类需要使用关闭事件时,只需要在子类中覆盖windowClosing()方法即可。
(2)动作事件及监听
在swing的事件处理中,可以使用ActionListener接口处理按钮的动作事件。ActionListener接口只定义了一个方法,void actionPerformed(actionEvent e)。当使用类匿名内部类的方式完成事件监听时,因为多动事件可能有多个事件源调用,为了保险起见,需要添加验证,通过事件e的getSource()方法判断事件源是谁,进行事件过滤。如果事件监听在单独的类中,可以通过关键词instanceof关键词来判断操作的数据源类型。
(3)键盘事件及监听处理
使用KeyListener接口可以对键盘的操作进行处理,此接口定义的方法有:void keyPressed(KeyEvent e), void keyRealeased(KeyEvent e), void keyTyped(KeyEvent)。使用KeyListener会对每个键盘的操作都进行监听,在键盘监听中可以使用KeyAdapter适配器完成特定键盘事件的监听。这时候需要指导键盘输入了什么。如果要获得键盘输入的内容,可以通过KeyEvent的方法获得,常用的方法有:Public char getKeyChar(), public int getKeyCode(), public Static String getKeyText(int keyCode)。
(4)鼠标点击事件及监听处理
使用MouseListener接口可以对鼠标的事件进行监听,比如鼠标点击、按下、松开、移入、移出等,该接口相应的方法是void mouseClicked (MouseEvent e), void mousePressed (MouseEvent e ), void mouseRelseased (MouseEvent e), void mouseEntered (MouseEvent e), void mouseExited (MouseEvent e).共5种方法。如果使用该接口,必须需要覆盖这5种方法。
为了简化,可以用MouseAdapter适配器完成对特定事件的监听,为了获取特定事件,需要用到MouseEvent的方法和常量。鼠标事件MouseEvent常用的方法和常量如下:public int getButton(), public static int BUTTON1,左键,public static int BUTTON2,中键,public static int BUTTON3,右键,public int getButton(),public int getClickCount(), public static String getMouseModifiersText(int modifiers), int getX(),int getY()
(5)鼠标拖拽事件及监听处理
在Swing的事件处理中可以使用MouseMotionListener接口完成鼠标的拖拽操作,MouseMotionListener接口中定义了下表的两种方法。void mouseDragged(MouseEvent e),void mouseMoved(MouseEvent e)。只要鼠标在窗体中移动就会触发鼠标移动事件mouseMoved();只要是在窗体中拖拽,就会触发拖拽事件mouseDragged()。在鼠标拖拽事件操作中同样也存在MouseMotinAdapter类,如果使用MouseMotinAdapter类则可以只监听自己需要的事件。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南