What is best way to pass object in JavaFX scene

(note, what i newbie in java)

I a little bit stuck in solving the problem of pass object between javafx scenes and classes.

For example, i have class, which waits for data by server; main class and 2 javafx windows. Let it looks like this:

Listener.java. Let it work at another thread. When we got "nelo" from server, then it'll means, what user not logged it, and then, we should open 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) {

        }
    }

}

Okay, there nothing weird. Just simple class for listening. But here my troubles started. I try to explain it. (previosly, Sorry for bad english, i still learn this language)

Lets create login window (imagine that fxml file and controller created :) ):

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


}

So, when user open application, client will try connect to server. If connection success, then server ask client for auth (Show login window). Next - user enter login and pass and click "Login" button. (Login Window show some indication of proccess). If auth success - Hide login, else - show some info in window.

As a result, i need access from Listener to Login window Controller. i.e. as i wrote before - different answer from server - different elements displayed.

How i can realize access to LoginWindowController ?

Thanks in advance

Upvotes: 0

Views: 1004

Answers (1)

Mansueli
Mansueli

Reputation: 6949

I will give you basic guidance for each task:

Connection

If connection with the server is successful then:

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

Login

Error

You set a blank label on the WindowController and if the user cound't autheticate, than you fill this label.

Succesful login

You could use the same Platform.runLater as I used it before, or you could do something using stackpane and changing it's order ( I strongly recommend to use the Platform.runLater).

Upvotes: 1

Related Questions