gpt4 book ai didi

Controller 中的 JavaFX 2 窗口事件处理

转载 作者:行者123 更新时间:2023-11-29 03:24:43 24 4
gpt4 key购买 nike

所以我正在尝试使用如下代码处理来 self 的 Controller 的 WINDOW_SHOWN 事件:

@Override
public void initialize(URL url, ResourceBundle resourceBundle) {

initializeDatePickers();
System.out.println("payer number in initialize: " + payerNumber);

URL location = getClass().getResource("/createUser.fxml");
FXMLLoader loader = new FXMLLoader();

try {
Parent root = (Parent) loader.load(location.openStream());
root.getScene().getWindow().setOnShown(new EventHandler<WindowEvent>() {
@Override
public void handle(WindowEvent event) {
System.out.println("ONSHOWN");
}
});
} catch (IOException e) {
e.printStackTrace();
}

}

但我得到的只是无尽的循环和程序崩溃。下面的代码也不起作用,它返回 NullPointerException:

@FXML private AnchorPane createUserDialog; //my root pane

@Override
public void initialize(URL url, ResourceBundle resourceBundle) {

createUserDialog.getScene().getWindow().addEventHandler(WindowEvent.WINDOW_SHOWN,
new EventHandler<WindowEvent>() {
@Override
public void handle(WindowEvent window) {
System.out.println("ONSHOWN");
}
});

}

实现 WindowEvent 接口(interface)根本不起作用,不知道为什么。那么,我该如何处理这个事件呢?为什么我有 NullPointerException?在文档中说 initialize() 仅在根 Pane 完全处理后调用。

最佳答案

当执行 initialize() 方法时,根 Pane 已完全构建,但未添加到场景或窗口中。 (initialize() 方法作为执行 FXMLLoader 的 load() 方法的一部分执行;检查调用它的代码,您将看到将根添加到场景并将其放置在之后的窗口中。)所以在执行intialize()的过程中,root.getScene()会返回null。

您可以使用绑定(bind)来检查窗口何时更改并为其附加一个监听器:

final EventHandler<WindowEvent> shownHandler = new EventHandler<WindowEvent>() {
@Override
public void handle(WindowEvent event) {
System.out.println("Shown");
}
};
Bindings.<Window>select(createUserDialog.sceneProperty(), "window").addListener(new ChangeListener<Window>() {

@Override
public void changed(ObservableValue<? extends Window> observable,
Window oldValue, Window newValue) {
if (oldValue != null) {
oldValue.removeEventHandler(WindowEvent.WINDOW_SHOWN, shownHandler);
}
if (newValue != null) {
newValue.addEventHandler(WindowEvent.WINDOW_SHOWN, shownHandler);
}
}

});

此代码假定根只添加到一个窗口;万一您在应用程序生命周期中将根从一个窗口中移出并将其放入另一个窗口中,您将需要从旧窗口中删除监听器。如果您需要这个,我会更新代码,但这会使它变得更复杂。

关于 Controller 中的 JavaFX 2 窗口事件处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21602362/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com