Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaFX:删除加载在BorderPane中心的场景_Java_Javafx 2_Fxml - Fatal编程技术网

JavaFX:删除加载在BorderPane中心的场景

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) {

我有一个JavaFX2.2应用程序,它在主屏幕上有一个边框窗格。在顶部窗格中,我有两个按钮“Button A”和“Button B”,分别动态加载边界窗格中央的场景“Scene A”和“Scene B”

“场景A”有两个按钮。其中一个在FXML文件中定义为“默认按钮”,另一个定义为“取消按钮”

“场景B”有一个文本字段和一个表视图

以下是主屏幕中用于在场景之间切换的代码片段

@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) {
  //...
}