事件監聽
在RIA 或者說 桌面客戶端gui android 開發中,事件的機制是必須的要學習了解的,
分類處理類型
在Java GUI 和swing中,事件通常通過實現listener的接口函數,並通過addXXXListener 或者 setOnXXXListener的形式來設置接口函數來實現事件的執行。
-因此JavaFX的監聽分為兩種:
-
控件級別監聽 ----->setonxxxxxxx()
-
屬性級別監聽 ----->onxxxxxxProperty().addxxxxxxx()
然而在JavaFX中,只有極少數的事件是遵循Java GUI和Android的模式即控件級別的監聽,例如,按鈕的點擊事件 。還增加了 觸摸事件 onTouch() 事件 -
這里要特別說一下: 如果要一個類實現監聽所有的鼠標事件,一般的方法是傳參數類值過去,然后判斷操作,但是這樣不能實現操作
package application;
import javafx.event.EventHandler;
import javafx.scene.input.MouseEvent;
public class myHandlert implements EventHandler<MouseEvent> {
@Override
public void handle(MouseEvent event) {
System.out.println(event.getSource());
if (event.getSource()=="Button[id=btnEraser, styleClass=button]'橡皮擦'") {
System.out.println(1);
}
if (event.getSource().equals("Button[id=btnBrush, styleClass=button]'畫筆'")) {
System.out.println(2);
}
}
}
- 控件級別監聽(代碼量少可以使用):
Button btn = new Button();
btn.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
doing codeing
}
});
- 2.實現EventHandler接口,單獨類創建事件代碼,與主代碼分離,我更青睞這種方式,可以統一管理事件,UI與具體事件分離:
Button btn = new Button();
button.addEventHandler(MouseEvent.MOUSE_EXITED, new ShadowEvent(button,false));
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);
}
}
}
- 屬性級別監聽:
[] 比如監聽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 的形式來進行事件監聽。理解這種方式將極大提升我們的開發效率。這樣的屬性還有很多,根據需要來操作.