【发布时间】:2018-07-27 16:05:47
【问题描述】:
我有一个controller,它会启动一个名为file 的新窗口:
// MainController.java
Stage primaryStage = new Stage();
FXMLLoader fx = new FXMLLoader(Paths.get("../file.fxml").toUri().toURL());
Scene scene = new Scene(fx.load());
primaryStage.setScene(scene);
primaryStage.show();
primaryStage.centerOnScreen();
FileController control = (FileController ) fx.getController();
control.getValiderBE().setOnAction(event1 -> {
System.out.prinln("here 1");
});
我在FXML file 中有一个按钮:
// file.fxml, fx:controller="FileController"
<Button fx:id="validerBE" onMouseClicked="#validerClickBE" text="Valider">
</Button>
在其controller(FileController 的实例)中我得到了:
FileController.java
@FXML
private Button validerBE;
@FXML
void validerClickBE(MouseEvent event) {
System.out.prinln("here 2");
}
public Button getValiderBE() {
return validerBE;
}
按以下顺序打印:here 1 => here 2。 FileController 中的 sometines 方法甚至没有被调用^^ 就像here 1 调用中的事件关闭
但我会按其他顺序,因为新的window 将一个元素添加到列表中,第一个源controller 应该刷新TableView(所以在添加操作之后)
【问题讨论】:
-
如果你想执行两个活动,你应该对两者使用相同的操作,为什么你不能使用相同的?
-
因为它们不在同一个控制器中
-
无论如何,将 UI 控件暴露在控制器之外是非常糟糕的做法。为什么你需要(或认为你需要)这样做?一般来说(尽管有一些 hacky 变通方法),没有办法控制监听器的执行顺序,所以如果两个动作相关或相互依赖,它们应该在同一个处理程序中执行
-
另外:不要使用
onMouseClicked作为按钮;使用onAction,否则如果用户使用键盘,处理程序将不会被调用。 -
@James_D 我“必须”这样做,因为我需要刷新 TableView 并且因为数据存储在其他地方并且需要修改(创建关联的 objectPropety)我只找到了清除的方法并再次设置项,只能在主控制器中完成
标签: java events button javafx javafx-8