JavaFX:删除加载在BorderPane中心的场景
我有一个JavaFX2.2应用程序,它在主屏幕上有一个边框窗格。在顶部窗格中,我有两个按钮“Button A”和“Button B”,分别动态加载边界窗格中央的场景“Scene A”和“Scene B” “场景A”有两个按钮。其中一个在FXML文件中定义为“默认按钮”,另一个定义为“取消按钮” “场景B”有一个文本字段和一个表视图 以下是主屏幕中用于在场景之间切换的代码片段JavaFX:删除加载在BorderPane中心的场景,java,javafx-2,fxml,Java,Javafx 2,Fxml,我有一个JavaFX2.2应用程序,它在主屏幕上有一个边框窗格。在顶部窗格中,我有两个按钮“Button A”和“Button B”,分别动态加载边界窗格中央的场景“Scene A”和“Scene B” “场景A”有两个按钮。其中一个在FXML文件中定义为“默认按钮”,另一个定义为“取消按钮” “场景B”有一个文本字段和一个表视图 以下是主屏幕中用于在场景之间切换的代码片段 @FXML private void handlebtnAAction(ActionEvent event) {
@FXML
private void handlebtnAAction(ActionEvent event) {
loadCentreScene("fxml/FXSceneA.fxml");
}
@FXML
private void handlebtnBAction(ActionEvent event) {
LoadCentreScene("fxml/FXSceneB.fxml");
}
private void loadCentreScene(String fxmlPath){
try {
FXMLLoader loader = new FXMLLoader(Admin.class.getResource(fxmlPath));
AnchorPane page = (AnchorPane) loader.load();
Plugin fxController = loader.getController();
fxController.setMainController(this);
Node node = getRootLayout().getCenter();
node = null;
getRootLayout().setCenter(page);
} catch (IOException ex) {
Dialogs.showErrorDialog(primaryStage, ex.getMessage(), "Loading Error");
}
}
现在,当我从“场景A”切换到“场景B”并在“场景B”上聚焦文本字段后点击“回车”按钮时,“场景A”上默认按钮的事件处理程序被执行
我也尝试过以下变化,但我仍然面临同样的问题
private void loadCentreScene(String fxmlPath){
try {
FXMLLoader loader = new FXMLLoader(Admin.class.getResource(fxmlPath));
AnchorPane page = (AnchorPane) loader.load();
Plugin fxController = loader.getController();
fxController.setMainController(this);
Node node = getRootLayout().getCenter();
getRootLayout().getChildren().remove(node); //<****Remove the node from children****>
getRootLayout().setCenter(null); //<****Set center to null****>
node = null;
getRootLayout().setCenter(page);
} catch (IOException ex) {
Dialogs.showErrorDialog(primaryStage, ex.getMessage(), "Loading Error");
}
}
private void loadCentreScene(字符串fxmlPath){
试一试{
FXMLLoader=newFXMLLoader(Admin.class.getResource(fxmlPath));
AnchorPane页面=(AnchorPane)loader.load();
插件fxController=loader.getController();
fxController.setMainController(此);
Node Node=getRootLayout().getCenter();
getRootLayout().getChildren().remove(节点)//
getRootLayout().setCenter(null)//
node=null;
getRootLayout().setCenter(第页);
}捕获(IOEX异常){
Dialogs.batherRorDialog(primaryStage,例如getMessage(),“加载错误”);
}
}
根据我的理解,对象应该是不可访问的,稍后应该进行垃圾收集。有谁能帮助我理解为什么“场景A”的对象仍然可以访问,以及为什么会为默认按钮调用事件处理程序 这是一个:当按钮不是场景的一部分时,它不应接收事件。这个错误在Java8中得到了修复。我提供了一个快速的例子,可以确认Java7中的bug以及Java8中的bug已经修复。您可能想在Java8中运行代码,看看它在那里是否正常工作
对于Java7解决方案,将代码包装在中的defaultButton(也可能是cancel按钮)的处理程序中
if (button.getScene() != null) {
//...
}