gpt4 book ai didi

javafx-2 - 将对象从一个场景传递到另一个场景

转载 作者:行者123 更新时间:2023-12-02 05:16:48 25 4
gpt4 key购买 nike

当我学习 JavaFX2 的新世界时,我偶然发现了另一个恼人的问题。我正在开发一个具有多个场景(~10 个场景)的程序。为此,我创建了一个像这样的小类:

public class SceneSelector {
...
public void setScene(Stage stage, String fxmlfilename, ObservableList ol) throws Exception{
String s = "../" + fxmlfilename;
Parent root = FXMLLoader.load(getClass().getResource(s));
root.setUserData(ol);

Scene scene = new Scene(root);
stage.setScene(scene);

//show the stage
stage.show();
}
}

这个类足以在场景之间切换。现在的问题是我有时需要将数据从Scene1传递到Scene2。我试图通过为新场景设置 setUserData() 来做到这一点,除了一件事之外,该场景基本上可以工作。新场景初始化时如何获取用户数据? (因为此时Nodes还是null)

场景1的代码:

//Code connected to a button that opens the new Scene
private void openLabID(ActionEvent event) throws Exception {
final Stage primaryStage = (Stage) btnNewScene.getScene().getWindow();

ObservableList<Koe> olAfTeWerkenKoeien = DA_Koe.getAfTeWerkenKoeien();
ss.setScene(primaryStage, "GUI/scenes/koe/Koe.fxml", olAfTeWerkenKoeien);
}

场景2的代码:

public void initialize(URL url, ResourceBundle rb) {
Scene s = lbl.getScene();
ObservableList<Koe> olAfTeWerkenKoeien = (ObservableList<Koe>) s.getRoot().getUserData();
System.out.println(olAfTeWerkenKoeien.size());
}

当然,此时 Scene s 给出了一个 null 值(因为此时 lbl 为 null),所以我想知道,是否有一个方法在初始化后立即被触发?

当我将此代码附加到 Scene2 上的按钮时,它的工作方式就像一个 super 按钮,但它应该自动加载。

编辑:使用 setMyData() 方法设置数据不是问题,但检索它是问题:

public ObservableList<Koe> getMyData() {
return this.myData;
}

Controller 初始化时如何获取 CustomScene 对象?因为下面这样做将导致 NullPointerException(因为 btnSluiten 尚未初始化):

@Override
public void initialize(URL url, ResourceBundle rb) {
...
Stage stage = (Stage) btnSluiten.getScene().getWindow();
CustomScene cs = (CustomScene) stage.getScene();

ObservableList<Koe> olKoe = cs.getMyData();

System.out.println(olKoe.size());
}

最佳答案

我相信您错过了 Scene 对象中的要点。从Scene类文档我们可以看到:

The JavaFX Scene class is the container for all content in a scene graph.

这意味着 Scene 对象只是一个容器,因此它不应该保存任何数据。

考虑到这一点,您可以使用诸如

之类的字段创建另一个静态对象
private static Label lbl;

...

public static Label getLbl()
{
return MyStaticObject.Lbl;
}

...

并使用它来存储您的lbl(或任何适合您的信息的对象),然后静态检索它。

我这样做是为了从我的应用程序中设置其他 Stage 对象的所有者。我希望它有帮助。干杯

关于javafx-2 - 将对象从一个场景传递到另一个场景,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11508182/

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