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 的形式来进行事件监听。理解这种方式将极大提升我们的开发效率。

												

最新文章

  1. 读&lt;&lt;领域驱动设计-软件核心复杂性应对之道&gt;&gt;有感
  2. DateUtil(SimpleDateFormat)
  3. iPad 控件UIPopoverController使用
  4. netty ByteBuf分析
  5. more命令
  6. CSS3中的选择器
  7. 关于Delphi中二维数组的声明和大小调整(对非基本类型数据,小心内存泄漏)
  8. VIM 用正则表达式
  9. PHP常用日期加减计算方法实例
  10. 【BZOJ5305】[HAOI2018]苹果树(组合计数)
  11. A pointer is a variable whose value is the address of another variable 指针 null pointer 空指针 内存地址0 空指针检验
  12. oracle表属性
  13. mysqlbinlog usage
  14. Hive(六)内置函数与高级操作
  15. 【LeetCode】46. Permutations (2 solutions)
  16. Ubuntu 16.04LTS 安装 Node.js stable
  17. iOS:视图切换的第一种方式:模态窗口
  18. PHP与理在事先
  19. 使用HTML5 canvas做地图(2)瓦片以及如何计算的
  20. 安装mezzanine时报:storing debug log for failure【已解决】

热门文章

  1. mysql 数据库复制方法
  2. Java学习笔记11(this,super)
  3. ORACLE中使用DBMS_RANDOM去产生随机数
  4. Linux fdisk命令操作磁盘(添加、删除、转换分区等)
  5. Java包、类、数据类型、表达式和标识符
  6. Python之路PythonThread,第四篇,进程4
  7. HDU - 5201 :The Monkey King (组合数 &amp; 容斥)
  8. 通过web.config来自定义output caching缓存
  9. Mybatis(七)-- LRU LFU 算法
  10. 服务器cpu负载过高问题排查