第一次听说监听是三年前,做一个webGIS的项目,当时对Listener的印象就是个“监视器”,监视着界面的一举一动,一有动静就触发对应的响应。

一、概述

通过对界面的某一或某些操作添加监听,可以自发地调用监听函数/监听类,对操作作出反应。举个栗子:被监听的操作是“你惹你妈生气了”,添加的响应是“你妈给你爸打电话,你爸回家了,你爸打你一顿 ”。所以不管什么时候,只要“你惹你妈生气了”,都会触发这个操作的监听,最终结果是每次你都会被你爸打一顿。屡试不爽,无一例外。这就是事件监听,java.util.EventListener。

Listener分很多种:ActionListener,MouseListener,PopMenuListener,windowListener等等。

二、监听事件实现方式

1. 直接在控件中添加监听

如:给“保存按钮”添加ActionListener监听

1 saveCharaEditButton.addActionListener(new ActionListener() {2

3 @Override4 public void actionPerformed(ActionEvent e) {5 //TODO Auto-generated method stub

6 save();7 }8 });

2.写一个监听类,实现监听接口。

添加事件监听时只需要 添加这个监听类就ok了。【PS:这个内部类与函数并列写就可以,不用另建类文件,只是前面注意不要加public修饰符。默认只能有一个public类。】

1 publicJPanel setRightPanel(){2 JPanel rightPanel = newJPanel();3 double[][] size = {{15,TableLayout.FILL,30,TableLayout.FILL,35},{10,30,10,TableLayout.FILL}};4 rightPanel.setLayout(newTableLayout(size));5 JButton saveCharaEditButton = new JButton("保存编辑");6 JButton enableCharaEditButton = new JButton("启用编辑");7 rightPanel.add(enableCharaEditButton, "1,1");8 rightPanel.add(saveCharaEditButton, "3,1");9 rightPanel.add(setCharaJCTablePanel(), "0,3,4,3");10 saveCharaEditButton.addActionListener(new saveEditToFloodCharacterValueListener());//添加监听

11 returnrightPanel;

12 }

1 class saveEditToFloodCharacterValueListener implements ActionListener{2

3 @Override4 public void actionPerformed(ActionEvent e) {5 //TODO Auto-generated method stub

6 FloodCharacterValue floodCharacterValue = newFloodCharacterValue();7 floodCharacterValue =FloodCharacterValue.transFldPropToFloodCharacterValue(editCharaFldprop);8 m_doc.m_floodExtractCharacterValue =floodCharacterValue;9 }10 }

3. 添加适配器,也可以实现监听。(其实方法同1)

首先说一下适配器和监听接口的不同:new一个监听接口,需要重载该接口下面的所有方法,你删除任何一个,都会报错;但是适配器可以只重载你需要的那个方法。

以windowListener为例,给对话框dialog添加监听addWindowListerner,然后监听内容为窗口适配器WindowAdapter。对比如下:

(1)监听接口【默认重载所有方法,功能需求单一时不推荐】

dialog.addWindowListener(newWindowListener() {

@Overridepublic void windowOpened(WindowEvent e) {//TODO Auto-generated method stub}

@Overridepublic void windowIconified(WindowEvent e) {//TODO Auto-generated method stub}

@Overridepublic void windowDeiconified(WindowEvent e) {//TODO Auto-generated method stub}

@Overridepublic void windowDeactivated(WindowEvent e) {//TODO Auto-generated method stub}

@Overridepublic void windowClosing(WindowEvent e) {//TODO Auto-generated method stub}

@Overridepublic void windowClosed(WindowEvent e) {//TODO Auto-generated method stub}

@Overridepublic void windowActivated(WindowEvent e) {//TODO Auto-generated method stub}

});

(2)添加适配器【可以只重载需要的方法,功能单一时推荐】

1 dialog.addWindowListener(new WindowAdapter() {2 @Override3 public void windowClosed(WindowEvent e) {4 //TODO Auto-generated method stub

5 JDialog dialog2 =(JDialog) e.getSource();6 set_infoSectionList(update_infoSectionListByProp(prop));7 if (basinCheckList != null && !basinCheckList.isEmpty() && basinCheckList.get(0).getCHECKED()==1) {8 tableCharaShowPanel.updateData(schemeType, get_infoSectionList(), false);9 }else{10 tableCharaShowPanel.updateData(schemeType, get_infoSectionList(), true);11 }12 super.windowClosed(e);13 dialog2.dispose();14 }15 });

另外,关于添加哪些适配器,可以选择WindowAdapter,右键菜单中选择-resources-override/implement methods... - 勾选需要添加的方法即可。

4. 添加全局控件的监听

背景:leftSecTypeList,rightSecTypeList,leftButton,rightButton 是this的全局控件变量。现在给他们添加鼠标点击监听.

这种操作一般分为两步:

(1)在初始化该控件的时候,添加参数为this的鼠标监听。

leftSecTypeList.addMouseListener(this);

(2)重写mouseClicked(MouseEvent e)函数,根据e.getSource() 判断是触发鼠标点击的是哪个控件,给出相应的反应。

1 publicJPanel createSelPanel(){2 JPanel panel = newJPanel();***22 leftSecTypeList.addMouseListener(this);23 rightSecTypeList.addMouseListener(this);24 leftButton.addMouseListener(this);25 rightButton.addMouseListener(this);26 returnpanel;27 }

1 @Override2 public void mouseClicked(MouseEvent e) {3 //TODO Auto-generated method stub

4 Object sourceObject =e.getSource();5 if (sourceObject == leftSecTypeList&& e.getClickCount() == 2) {6 HFSection section =leftSecTypeList.getSelectedItemType();

9 }else if (sourceObject == rightSecTypeList&& e.getClickCount() == 2) {10 HFSection section =rightSecTypeList.getSelectedItemType();11 }else if (sourceObject ==leftButton) {12

13 }else if (sourceObject ==rightButton) {14

15 }16 }

5.利用类AbstractButton的set/get动作命令。

void

string

//创建菜单Item的函数

privateJMenuItem createMenuItem(String text,String actionCommand)

{

JMenuItem item= newJMenuItem(text);

item.setActionCommand(actionCommand);//设置此按钮的动作命令

item.addActionListener(newMenuActionListener());returnitem;

}

//创建菜单

private voidinitPopupMenu()

{

layerPopupMenu= newJPopupMenu();

layerPopupMenu.add(createMenuItem("添加目录","addDir"));

layerPopupMenu.add(createMenuItem("添加图层","addLayer"));

layerPopupMenu.addSeparator();

layerPopupMenu.add(createMenuItem("上移","up"));

layerPopupMenu.add(createMenuItem("下移","down"));

}

// 右键菜单操作命令 class MenuActionListenerimplementsActionListener

{

@Overridepublic voidactionPerformed(ActionEvent e)

{

String actionCommand=e.getActionCommand();if(actionCommand.equals("addDir")){ addDir();}else if(actionCommand.equals("addLayer")){ addLayer();}else if(actionCommand.equals("up")){ layerUp();}else if(actionCommand.equals("down")){ layerDown();}

}

6. 以接口实现对按钮的监听响应

1.在工具条面板中:(1)定义响应接口 (2)以接口定义响应变量 (3)定义按钮,监听响应为变量

2.在调用文件中: 以implents方式实现 工具条面板中对应的接口变量

//1-1 ControlBarPanel.java 定义接口

public interfaceIBackwardActionPerformed{public voidActionPerformed(ActionEvent e);

}//1-2 ControlBarPanel.java 以接口定义响应变量

publicIBackwardActionPerformedbackwardActionPerformed;//1-3 ControlBarPanel.java 定义按钮,监听响应为变量

backwardButton.addActionListener(newActionListener() {

@Overridepublic voidactionPerformed(ActionEvent e) {//TODO Auto-generated method stub

backwardActionPerformed.ActionPerformed(e);

}

});//2-1 MainForcastPanel.java 实现响应变量具体操作

controlBarPanel.backwardActionPerformed= newBackwardBtnActionListener();//2-2 MainForcastPanel.java 实现响应变量具体操作

class BackwardBtnActionListener implementsIBackwardActionPerformed,Runnable {

@Overridepublic voidActionPerformed(ActionEvent e) {//TODO Auto-generated method stub

Thread thread = new Thread(this);new HFProgressPane1(thread, "正在计算中......", null, null);

}

@Overridepublic voidrun() {//TODO Auto-generated method stub

************}

}

3. 方法6的详细代码

1 public class ControlBarPanel extends JPanel implementsActionListener{2 private JButton jButton;

3 publicIActionPerformed iActionPerformed;4

5 publicJPanel createPanel(){6 JPanel panel = newJPanel();7 panel.setLayout(new FlowLayout(FlowLayout.LEFT, 2, 0));8 jButton = new JButton("testButton");9 jButton.setMargin(new Insets(0, 0, 0, 0));10 jButton.addActionListener(newActionListener() {11 @Override12 public voidactionPerformed(ActionEvent e) {13 //TODO Auto-generated method stub

14 iActionPerformed.ActionPerformed(e);15 }16 });17 panel.add(createForeTypePanel());18 panel.add(jButton);19 returnpanel;20 }21

22 public interfaceIActionPerformed {23 public voidActionPerformed(ActionEvent e);24 }25 }26

27 public class ShowPanel extendsJPanel {28 privateControlBarPanel controlBarPanel;29 //构造函数

30 publicShowPanel() {31 controlBarPanel = newControlBarPanel();32 controlBarPanel.iActionPerformed = newActionListener();33 this.setLayout(newBorderLayout());34 this.add(controlBarPanel,BorderLayout.NORTH);35 }36

37 class ActionListener implementsIActionPerformed{38 @Override39 public voidActionPerformed(ActionEvent e) {40 //TODO Auto-generated method stub

41 function(e);42 }43 }44 }

7. 添加监听列表,然后通知所有监听。

分为三步

(1)定义变量:监听列表

(2)定义函数:注册监听,删除监听

(3)定义函数:通知所有监听

代码如下:

1 /**

2 * 拖动完成后监听保存队列3 */

4 private List dragOverListenerList =newArrayList();5

6 /**

7 * 注册监听事件8 */

9 public voidaddDragOverListener(DragOverListener listener){10 synchronized(objSync) {11 dragOverListenerList.add(listener);12 }13 }14

15 /**

16 * 删除监听17 *@parameventObject18 */

19 public voidremoveDragOverListener(DragOverListener listener){20 synchronized(objSync) {21 dragOverListenerList.remove(listener);22 }23 }24

25 /**

26 * 通知所有监听事件27 */

28 private voidnotifyAllListener(){29 for(int i=0;i

在需要调用监听的地方,添加通知监听事件的函数即可。

四、小结

以上是一些Java事件监听与使用方法的一些介绍,属于入门级别。高级应用后期再予以学习与记录。

写于2017年1月6日

java jmenu 监听_Java中用得比较顺手的事件监听相关推荐

  1. java swing事件监听_Java swing(awt):事件监听机制的实现原理+简单示例

    (1)实现原理 事件监听机制的实现: 参考图:事件模型_ActionEvent 为了节省资源,系统无法对某个事件进行实时的监听.故实现的机制是当发生某个事件后,处理代码将被自动运行,类似钩子一般.(回 ...

  2. java 关闭按钮监听_Java事件处理(1)——实现简单的事件监听功能

    假设我们已经建立了一个窗体,并且添加了一个按钮组件. 例:模拟登录界面 1 import javax.swing.*;2 import java.awt.*;3 4 public class Logi ...

  3. java 接口文件夹_Java NIO.2 使用Path接口来监听文件、文件夹变化

    Java7对NIO进行了大的改进,新增了许多功能: •对文件系统的访问提供了全面的支持 •提供了基于异步Channel的IO 这些新增的IO功能简称为 NIO.2,依然在java.nio包下. 早期的 ...

  4. java swing(GUI图形化界面)基础教程3-添加事件监听1

    学习此内容前建议先去学习java基础知识: 匿名内部类 (学的多的可以用lambda表达式,更加简便) 好, 我们先看一下之前的代码(即一个窗口和一个按钮) 如果想看详细内容,链接为: (23条消息) ...

  5. html中事件监听的使用,Vue.JS入门篇--事件监听

    你可以使用 v-on 指令来绑定并监听 DOM 事件.绑定的内容可以是一个当前实例上的方法 (后面无需跟括号) 或一个内联表达式.如果提供的是一个方法,则原生的 DOM event 会被作为第一个参数 ...

  6. java完成键盘动作_java实现鼠标和键盘动作后台监听

    有的时候需要我们对鼠标和键盘的动作(鼠标的移动,键盘的点击)进行监听,比如按键记录,鼠标坐标记录等. 我们使用JNA来实现以上的操作 tips:JNA类库使用一个很小的本地类库sub 动态的调用本地代 ...

  7. java 用什么表示_java中用什么运算符表示“或”

    java中用什么运算符表示"或" 发布时间:2020-06-28 13:38:32 来源:亿速云 阅读:105 作者:Leah java中用什么运算符表示"或" ...

  8. java邮箱地址正则表达式_Java 中用正则表达式修改 Email 地址

    需求 系统中有一列会用来存储 email 地址,现在需要对输入的字符串进行过滤, 要求是,把无效的地址过滤掉.有一些需要说明的是 这些地址是通过图像识别得到的,有些是用户自己输入的 已有历史记录已经存 ...

  9. java 日期类 周_Java中用Calendar类计算周和周的起始日期

    package com.tongyue.hot.web; import java.util.Calendar; import java.util.Date; import java.util.Greg ...

最新文章

  1. 阿里某新员工感慨:入职阿里三个月生活一团糟,想辞职休息
  2. “贝叶斯网络之父”:不透明机器学习的局限性
  3. MOSS 权限管理总结
  4. 对于Array的引用
  5. 机器学习 来源框架_机器学习的秘密来源:策展
  6. 零基础逆向工程24_C++_01_类_this指针_继承本质_多层继承
  7. idea android 模块,IntelliJ IDEA 12 - 新的Android应用程序模块向导失败,“无法找到模块的资源目录”...
  8. GitLab 安装配置指南
  9. BZOJ1646[Usaco2007 Open] 抓住那头牛
  10. 水经注万能地图下载器如何导出透明TIF标签
  11. python工厂模式和单例模式_python之单例模式和工厂模式
  12. Webstorm如何下载插件
  13. set_include_path()
  14. Microsoft Visual C++ 6.0预处理器参考手册
  15. Spark之数据本地性(data locality)
  16. SSL安全证书过期的原因及解决方法
  17. Linux 监控文件变化
  18. 区块链的共识机制是什么?
  19. nba2k14mod android,nba2k14安卓mod
  20. Argo CD系列视频图文版之安装 argocd 并运行示例

热门文章

  1. Java NIO---1
  2. sklearn中的逻辑回归
  3. MQ的连接是否是线程安全的
  4. 深入分析Ribbon源码分析
  5. linux环境下rocketMq双master集群搭建
  6. jsp 通过cookie 记住用户名
  7. AngularJS之过滤器
  8. 【思科百难】RIP两个版本之间能够相互通信?
  9. PHP微信公众平台源码 支持多账号 仿pigcms 小猪微信 已经修改完毕 完整可用
  10. 大屏监控系统实战(13)-10分钟投票增量曲线制作(二)