Javafx 2 JavaFX:Node已丢失它';父母
我正在尝试制作一个复杂的(愚蠢的mb?)算法,在打开的应用程序窗口之间传递参数。 我在做什么:Javafx 2 JavaFX:Node已丢失它';父母,javafx-2,Javafx 2,我正在尝试制作一个复杂的(愚蠢的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();
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);
}
}
});