从一个场景物体传递到另一个(Pass object from one scene to anothe

2019-07-30 11:29发布

由于我正在学习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();
    }
}

这个类的工作为场景之间的切换不够好。 现在的问题是,我有时需要从场景1数据传递到第二幕:。 我试图通过设置这样做setUserData()的新场面basicly工作exept一两件事。 我怎样才能获得用户数据时,新的场景将被初始化beeing? (因为节点仍然是空当时)

在代码SCENE1:

//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);
}

在代码SCENE2:

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

当然景S在这一点上给出了一个空值(因为LBL在这一点零),所以我不知道,有没有被解雇beeing之后初始化方法?

当我这个代码附加到第二幕:一个按钮,它就像一个魅力,但它应该会自动加载。

编辑:与setMyData数据()方法是没有问题的,然而检索它的设置:

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

我怎样才能获得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());
}

Answer 1:

我相信你错过了场景物体内的点。 从现场类文档,我们可以看到:

JavaFX的场景类是场景图中所有内容的容器。

这意味着场景的对象仅仅是一个容器,因此它不应该包含任何数据。

考虑到这一点,你可以用一个领域,如另一静态对象

private static Label lbl;

...

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

...

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

我这样做,从我的应用程序设置我的其他舞台对象的所有者。 我希望它能帮助。 干杯



Answer 2:

如果你真的想你的场景是有意义的(又名存储特定的用户数据),你可以扩展它:

public class FooScene extends Scene {
   private ObservableList myData;

   public setMyData(ObservableList data) {
       this.myData = data;
       //handle data
   }
}

确保安装代码最简单的方法被调用后现场初始化它自己来调用它:

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

        // first: add root to scene
        FooScene scene = new FooScene(root);
        // second: apply data to scene (or root)
        scene.setMyData(ol);
        stage.setScene(scene);

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


Answer 3:

您可以使用控制器的场景,并通过控制器传递数据:

String filePath1 =  "../" + fxmlfilename;
URL location1 = YourController1.class.getResource(filePath1);
FXMLLoader fxmlLoader = new FXMLLoader();
fxmlLoader.setLocation(location1);
fxmlLoader.setBuilderFactory(new JavaFXBuilderFactory());
Parent root = (Node) fxmlLoader.load(location1.openStream());

YourController1 ctrl1 = (YourController1) fxmlLoader.getController();

然后你就可以将数据分配到控制器:

ctrl1.setUserData();

最后,只是展会现场,只要你想:

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

//show the stage
stage.show();

在控制器中的initialize()方法,只是从控制器照常数据对象获取数据。



文章来源: Pass object from one scene to another