1 事件监听

最近利用javaFX开发桌面客户端,碰到需要给各种UI控件添加事件监听,在这里做一个简单的小结,供日后参考。

2 分类处理

JavaGUI 和Android中,事件通常通过实现listener的接口函数,并通过addXXXListener 或者 setOnXXXListener的形式来设置接口函数来实现事件的执行。

因此JavaFX的监听分为两种:

  • 控件级别监听
  • 属性级别监听

然而在JavaFX中,只有极少数的事件是遵循Java GUI和Android的模式即控件级别的监听,例如,按钮的点击事件 。

一、控件级别监听:

举例说明,Button点击事件处理的两种方式:

1.直接对具体button监听,写在主代码中:

Button btn = new Button();
btn.setText("Say 'Hello World'");
btn.setOnAction(new EventHandler<ActionEvent>() { @Override
public void handle(ActionEvent event) { }
});

2.实现EventHandler接口,单独类创建事件代码,与主代码分离,我更青睐这种方式,可以统一管理事件,UI与具体事件分离:

/**
* Created by loongshaw on 2016/10/28.
* CatalogCheckPage.java代码片段
* NOTE 监听片段
*/
Button btn = new Button();
button.addEventHandler(MouseEvent.MOUSE_EXITED, new ShadowEvent(button,false)); /**
* Created by loongshaw on 2016/10/28.
* ShadowEvent.java代码片段
* NOTE 按钮阴影效果
*/
public class ShadowEvent implements EventHandler<MouseEvent> { Button button;
DropShadow dropShadow;
boolean select; public ShadowEvent(Button button,DropShadow dropShadow,boolean select){
this.button = button;
this.dropShadow = dropShadow;
this.select = select;
} public ShadowEvent(Button button,boolean select){
this.button = button;
this.select = select;
} public void handle(MouseEvent event) {
if (select){
button.setEffect(dropShadow);
} else {
button.setEffect(null);
} }
}

二、属性级别监听:

JavaFX最重要的特性就是属性绑定 ,所有跟“属性”有关的事件,将一概不会通过“控件.setOnXXXX”这种形式执行。而是通过“属性绑定”来监听属性的改变 ,来执行事件,这一点将通过下述例子说明。

举例说明:

例一、比如监听checkbox是否选中,这是对selectedProperty这个属性进行监听,因此需要实现ChangeListener接口。

// CatalogCheckPage.java代码片段
checkBox.selectedProperty().addListener(new MyCheckBoxListener(checkBox,buttonOfPreEditionDataPath,textInputOfPreEditionDataPath)); // MyCheckBoxListener.java代码片段
public class MyCheckBoxListener implements ChangeListener<Boolean> { TextField textfield = new TextField();
Button button = new Button();
CheckBox checkBox; public MyCheckBoxListener(CheckBox checkBox,Button button,TextField textfield){
this.checkBox = checkBox;
this.button = button;
this.textfield = textfield;
} public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue){
boolean select = checkBox.isSelected();
// logger.info("checkbox newValue:" + newValue +",oldValue:"+oldValue);
if (!select) {
textfield.setDisable(true);
button.setDisable(true);
} else {
textfield.setDisable(false);
button.setDisable(false);
}
}
}

例二、比如监听窗口大小的改变,这是对Stage类的widthProperty这个属性进行监听,因此需要实现ChangeListener接口,同时ChangeListener里会回调一个“属性改变前的值”和“属性改变后的值”。

// MainPage.java代码片段
primaryStage.widthProperty().addListener(new StageChangeListener(primaryStage)); // StageChangeListener.java窗体变化监听,当前用来设置图标
public class StageChangeListener implements ChangeListener<Number> { Stage stage; public StageChangeListener(Stage stage){
this.stage = stage;
} public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) { stage.getIcons().add(ImageUtil.getImage("/image/tools.png"));
}
}

所以在JavaFX中,所有跟属性改变相关的事件,都可以根据 XXX.xxxxProperty().addListener 的形式来进行事件监听。理解这种方式将极大提升我们的开发效率。

												

利用JavaFx开发RIA桌面应用-事件监听的更多相关文章

  1. 利用JavaFx开发RIA桌面应用-在线资料

    转载请注明来源-作者@loongshawn:http://blog.csdn.net/loongshawn/article/details/52805751 1.前言 虽说java已经不是主流的桌面应 ...

  2. Android 开发中的View事件监听机制

    在开发过程中,我们常常根据实际的需要绘制自己的应用组件,那么定制自己的监听事件,及相应的处理方法是必要的.我们都知道Android中,事件的监听是基于回调机制的,比如常用的OnClick事件,你了解它 ...

  3. android开发事件监听

    第一种:匿名内部类作为事件监听器类 大部分时候,事件处理器都没有什么利用价值(可利用代码通常都被抽象成了业务逻辑方法),因此大部分事件监听器只是临时使用一次,所以使用匿名内部类形式的事件监听器更合适, ...

  4. JAVA 图形开发之计算器设计(事件监听机制)

    /*文章中用到的代码只是一部分,需要源码的可通过邮箱联系我 1978702969@qq.com*/ 前段时间刚帮同学用MFC写了个计算器,现在学到JAVA的图形开发,就试着水了一个计算器出来.(可以说 ...

  5. PyQt开发实战: 利用QToolBox开发的桌面工具箱

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 一.引言 toolBox工具箱是一个容器部件,对应类为QToolBox,在其内有一列从上到下顺序排列 ...

  6. JS 中的事件绑定、事件监听、事件委托

    事件绑定 要想让 JavaScript 对用户的操作作出响应,首先要对 DOM 元素绑定事件处理函数.所谓事件处理函数,就是处理用户操作的函数,不同的操作对应不同的名称. 在JavaScript中,有 ...

  7. java Gui编程 事件监听机制

    1.     GUI编程引言 以前的学习当中,我们都使用的是命令交互方式: 例如:在DOS命令行中通过javac java命令启动程序. 软件的交互的方式:   1. 命令交互方式    图书管理系统 ...

  8. Netty事件监听和处理(上)

    陪产假结束了,今天又开始正常上班了,正好赶上米粉节活动,又要忙上一阵了,米粉节活动时间为4.03 - 4.10,有不少优惠,感兴趣的可以关注mi.com或小米商城app. 今天给大家送了福利:小爱音箱 ...

  9. JS 事件绑定、事件监听、事件委托详细介绍

    原:http://www.jb51.net/article/93752.htm 在JavaScript的学习中,我们经常会遇到JavaScript的事件机制,例如,事件绑定.事件监听.事件委托(事件代 ...

随机推荐

  1. HDU 6063 17多校3 RXD and math(暴力打表题)

    Problem Description RXD is a good mathematician.One day he wants to calculate: ∑i=1nkμ2(i)×⌊nki−−−√⌋ ...

  2. async 函数--学习笔记一

    含义: ES2017 标准引入了 async 函数,使得异步操作变得更加方便.async 函数是什么?一句话,它就是 Generator 函数的语法糖. 前文有一个 Generator 函数,依次读取 ...

  3. c++ 中:和::理解

    1.冒号(:)用法 (1)表示机构内位域的定义(即该变量占几个bit空间) typedef struct _XXX{ unsigned char a:4; unsigned char c; } ; X ...

  4. 安装最新nginx

    另外:http://nginx.org/en/linux_packages.html#mainline https://blog.csdn.net/hiram/article/details/5178 ...

  5. 强化学习论文(Scalable agent alignment via reward modeling: a research direction)

     原文地址: https://arxiv.org/pdf/1811.07871.pdf ======================================================== ...

  6. 20165228 2017-2018-2 《Java程序设计》第5周学习总结

    20165228 2017-2018-2 <Java程序设计>第5周学习总结 教材学习内容总结 内部类和匿名类 通过throw关键字抛出异常对象,终止方法的继续执行 使用try-catch ...

  7. jQuery的事件

    事件冒泡处理 使用event.stopPropagation();阻止事件冒泡 冒泡事件也可以使用return false来处理 并且 <script type="text/javas ...

  8. 螺旋图 comet3 (comet) 不同轴的圆周运动图

    matlab 绘图 螺旋图小实例  动态显示comet3函数(comet显示平面) t=[:]; x=*t*sin(pi/).*cos(*t); y=*t*sin(pi/).*sin(*t); z=* ...

  9. Unity 3D-Canvas画布的三种模式

    Unity开发VR之Vuforia 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- ...

  10. C语言--第六周作业评分和总结(5班)

    作业链接:https://edu.cnblogs.com/campus/hljkj/CS2017-5/homework/1250 一.评分要求 要求1 完成PTA第六周所有题,若存在抄袭现象,倒扣此题 ...