Javafx 2 JavaFX:Node已丢失它';父母

Javafx 2 JavaFX:Node已丢失它';父母,javafx-2,Javafx 2,我正在尝试制作一个复杂的(愚蠢的mb?)算法,在打开的应用程序窗口之间传递参数。 我在做什么: 我有一个带有必要字段的窗格扩展类。这将是“大门” 调用控制器从FXML加载节点树,将其作为子对象附加到“gate”对象 然后创建并显示一个以“门”作为根节点的新场景 新的窗口控制器有一个对FXML根节点(“门”的直接子节点)的引用,他所需要做的就是在其上使用.getParent()来获取“门” 但真见鬼!它返回空值! 我做错了什么?我应该通过FXMLLoader设置不同的控制器吗 什么是组织从一个控制

我正在尝试制作一个复杂的(愚蠢的mb?)算法,在打开的应用程序窗口之间传递参数。 我在做什么:

  • 我有一个带有必要字段的窗格扩展类。这将是“大门”
  • 调用控制器从FXML加载节点树,将其作为子对象附加到“gate”对象
  • 然后创建并显示一个以“门”作为根节点的新场景
  • 新的窗口控制器有一个对FXML根节点(“门”的直接子节点)的引用,他所需要做的就是在其上使用.getParent()来获取“门”
  • 但真见鬼!它返回空值! 我做错了什么?我应该通过FXMLLoader设置不同的控制器吗

    什么是组织从一个控制器到另一个控制器的消息流的正确方法

    以下是代码块: 主要应用程序类别:

    private void handleMenuVisibility(ActionEvent event) throws IOException
    {
        Parent root = FXMLLoader.load(getClass().getResource("/ContextMenus/Visibility.fxml"));
        final AttributedWrapper aw = new AttributedWrapper();
        aw.getChildren().add(root);
        Scene scene = new Scene(aw);
        Stage stage = new Stage();
        stage.setScene(scene);
        stage.show();
    }
    
    和被调用的窗口控制器:

    public void initialize(URL url, ResourceBundle rb) {
    AttributedWrapper aw = (AttributedWrapper) anchorPane.getParent();
    }
    
    upd:AttributedWrapper是一个扩展javafx.scene.layout.Pane的类

    主要upd: 在此处找到一些信息: 我使用attributedWrapper作为FXML文件的根节点,通常它可以工作。但问题仍然存在于调用的控制器初始化中。我从主应用程序控制器发送到调用的参数不可用。功能

        public void initialize(URL url, ResourceBundle rb)
    
    在执行FXMLLoader.load()时以及在我将数据放入包装器之前准确启动

    以下是要点: 主应用程序

    调用控制器

    @FXML private AttributedWrapper aw;
    public void initialize(URL url, ResourceBundle rb) {
    System.out.println(aw.readParam("key1"));
    anchorPane.writeParam("key2", "value2");
    }
    
    关闭调用的窗口后,我读取了“key2”参数,这是正常的,但从调用的窗口读取“key1”返回null


    在这里传递参数的正确方式是什么?或者我所能做的就是创建静态字段?

    问题是在FXMLLoader调用期间调用了方法
    public void initialize(URL URL,ResourceBundle rb)

    Parent root = FXMLLoader.load(getClass().getResource("/ContextMenus/Visibility.fxml"));
    
    因此,您的家长尚未设置

    有几种方法可以解决这个问题:

  • 将初始化逻辑移到单独的方法中并手动调用:

    FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/ContextMenus/Visibility.fxml"));
    Parent root = fxmlLoader.load();
    controller = (MyController) fxmlLoader.getController();
    final AttributedWrapper aw = new AttributedWrapper();
    aw.getChildren().add(root);
    controller.doMyInit();
    
  • 使用“主要upd”方法,但同样——在设置参数后调用custom init

  • 将侦听器添加到anchorPane.parentProperty()并执行初始化,然后父对象变为not
    null

    root.parentProperty().addListener(new ChangeListener<Parent>() {
    
        @Override
        public void changed(ObservableValue<? extends Parent> ov, Parent oldP, Parent newP) {
            if (newP != null && oldP == null) {
                System.out.println("my parent is " + newP);
            }
        }
    });
    
    root.parentProperty().addListener(新的ChangeListener()){
    @凌驾
    
    public void已更改(Observalevalue您如何实现(2)和(4)?在您的代码中,您创建了root,但从未使用过它。很抱歉,我剪切了一些代码以仅发布essentials并删除了这一行。现在它已修复。这就解释了一切!谢谢。
    root.parentProperty().addListener(new ChangeListener<Parent>() {
    
        @Override
        public void changed(ObservableValue<? extends Parent> ov, Parent oldP, Parent newP) {
            if (newP != null && oldP == null) {
                System.out.println("my parent is " + newP);
            }
        }
    });