在JavaFX场景中传递对象的最佳方法是什么

时间:2014-07-11 13:24:53

标签: java javafx

(注意,我在java中的新手)

我在解决javafx场景和类之间传递对象的问题上有点困难。

例如,我有类,它等待服务器的数据;主类和2个javafx窗口。 让它看起来像这样:

Listener.java。 让它在另一个线程上工作。当我们得到" nelo "从服务器,然后它意味着,用户没有记录它,然后,我们应该打开Login Window

// some package
// some imports

public class Listener extends Thread {

    public void run() {
        System.out.println("[INF] Wait for server...");

        while(true) {
            handle();
        }
    }

    public void handle()
    {
        try {
            byte[] token = new byte[6];
            DataInputStream src = new DataInputStream(in);

            src.read(token);
            String token_val = new String(token);

            switch (token_val) {
                case "_nelo_":
                    System.out.println("[INF] Auth required");
                    break;
            }

        } catch (IOException e) {

        }
    }

}

好的,没有什么奇怪的。只是简单的听力课程。 但是我的麻烦开始了。我试着解释一下。 (先生,抱歉英语不好,我还是学这门语言)

让我们创建登录窗口(想象一下fxml文件和控制器创建:)):

// some package
// some imports
public class WindowLogin extends Application{

    private Stage stage;

    @Override
    public void start(Stage primaryStage) throws Exception {
        stage = new Stage();
        try {
            URL location = getClass().getResource("../views/WindowLogin.fxml");

            FXMLLoader fxmlLoader = new FXMLLoader();
            fxmlLoader.setLocation(location);
            fxmlLoader.setBuilderFactory(new JavaFXBuilderFactory());

            Parent root = (Parent) fxmlLoader.load(location.openStream());

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

            stage.show();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void show(){
        launch();
    }


}

因此,当用户打开应用程序时,客户端将尝试连接到服务器。 如果连接成功,则服务器请求客户端进行身份验证(显示登录窗口)。接下来 - 用户输入登录并通过并单击"登录"按钮。 (登录窗口显示过程的一些指示)。如果auth成功 - 隐藏登录,否则 - 在窗口中显示一些信息。

因此,我需要从Listener访问Login window Controller。也就是我之前写的 - 来自服务器的不同答案 - 显示了不同的元素。

我如何才能实现对LoginWindowController的访问?

提前致谢

1 个答案:

答案 0 :(得分:1)

我会为每项任务提供基本指导

<强>连接

如果与服务器的连接成功,则:

        Platform.runLater(new Runnable() {
            public void run() {
                try {
                    WindowLogin login = new WindowLogin();
                    login.start(new Stage());
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });

登录

错误

您在WindowController上设置了blank标签,并且用户是否认证,而不是填写此标签。

成功登录

您可以使用与之前使用的相同的Platform.runLater,或者您可以使用stackpane并更改它的顺序(我强烈建议您使用Platform.runLater)。