利用JavaFx开发RIA桌面应用-事件监听
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 的形式来进行事件监听。理解这种方式将极大提升我们的开发效率。
最新文章
- 读<;<;领域驱动设计-软件核心复杂性应对之道>;>;有感
- DateUtil(SimpleDateFormat)
- iPad 控件UIPopoverController使用
- netty ByteBuf分析
- more命令
- CSS3中的选择器
- 关于Delphi中二维数组的声明和大小调整(对非基本类型数据,小心内存泄漏)
- VIM 用正则表达式
- PHP常用日期加减计算方法实例
- 【BZOJ5305】[HAOI2018]苹果树(组合计数)
- A pointer is a variable whose value is the address of another variable 指针 null pointer 空指针 内存地址0 空指针检验
- oracle表属性
- mysqlbinlog usage
- Hive(六)内置函数与高级操作
- 【LeetCode】46. Permutations (2 solutions)
- Ubuntu 16.04LTS 安装 Node.js stable
- iOS:视图切换的第一种方式:模态窗口
- PHP与理在事先
- 使用HTML5 canvas做地图(2)瓦片以及如何计算的
- 安装mezzanine时报:storing debug log for failure【已解决】