如何使用 JavaFX 将对象从一个控制器传递到另一个控制器

灌篮高手

我目前正在尝试构建一个具有登录和注销功能的客户端-服务器应用程序。在 LoginViewController 中,我正在创建一个客户端对象。我希望能够在 ClientViewController 中使用这个对象,例如用于注销。如何将此对象从 LoginViewController 传递到 ClientViewController?由于登录成功,我不想实例化一个新对象,我想使用通过登录并且当前在服务器端处于活动状态的对象。

如何做到这一点?


主程序

public class Main extends Application {
    private static Stage primaryStage;
    private static BorderPane mainLayout;

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) throws Exception {
        this.primaryStage = primaryStage;
        showLoginView();
    }

    public static void showLoginView() throws IOException {
        FXMLLoader loader = new FXMLLoader();
        loader.setLocation(Main.class.getResource("LoginView.fxml"));
        mainLayout = loader.load();
        Scene scene = new Scene(mainLayout, 540, 400);
        primaryStage.setScene(scene);
        primaryStage.setResizable(false);
        primaryStage.show();
    }

    public static void showClientView() throws IOException {
        FXMLLoader loader = new FXMLLoader();
        loader.setLocation(Main.class.getResource("ClientView.fxml"));
        mainLayout = loader.load();
        Scene scene = new Scene(mainLayout, 900, 600);
        primaryStage.setScene(scene);
        primaryStage.setResizable(true);
        primaryStage.show();
    }
}

登录视图控制器.java

public class LoginViewController implements Initializable {
    @FXML
    private Main main;
    @FXML
    private TextField username;
    @FXML
    private PasswordField password;
    @FXML
    private Button login;
    @FXML
    private Button register;

    private Client client;

    private Login userLogin;

    private String loginStatus;

    @FXML
    private Label loginInfo;

    @Override
    public void initialize(URL location, ResourceBundle resources) {
        loginInfo.setVisible(false);
    }

    @FXML
    public void login() throws IOException {
        loginStatus = "timeout";
        loginInfo.setVisible(false);
        client = new Client("127.0.0.1", 3250, this); // Client object created
        userLogin = new Login(username.getText(), password.getText());
        client.setOnConnected(() -> client.sendToServer(userLogin));
        client.start();
        int waitForLoginStatusCounter = 0;
        while(loginStatus.equals("timeout")) {
            try {
                Thread.sleep(250);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            waitForLoginStatusCounter++;
            if(waitForLoginStatusCounter >= 20) {
                break;
            }
        }
        if(loginStatus.equals("success")) {
            main.showClientView();
        }
        else if(loginStatus.equals("failed")) {
            loginInfo.setVisible(true);
            loginInfo.setText("Login failed: Wrong username or password");
        }
        else {
            loginInfo.setVisible(true);
            loginInfo.setText("Timeout: Check connection");
        }
    }

    public String getLoginStatus() {
        return loginStatus;
    }

    public void setLoginStatus(String loginStatus) {
        this.loginStatus = loginStatus;
    }
}

客户端视图控制器.java

public class ClientViewController implements Initializable {

    @FXML
    private Main main;
    @FXML
    private TreeView<String> treeview;
    @FXML
    private Button logout;

    private Client client;

    private String username;

    private Logout userLogout;

    @Override
    public void initialize(URL location, ResourceBundle resources) {

    }

    @FXML
    public void logout() throws IOException {
        userLogout = new Logout(username);
        client.sendToServer(userLogout); // Null at this point
        main.showLoginView();
    }
}

Client.java(从服务器发送和接收对象)

public class Client extends Thread {
    private String ip;
    private int port;
    private Socket socket;
    private ObjectOutputStream oos;
    private ObjectInputStream ois;
    private Runnable onConnected;
    private LoginViewController lvc;
    private RegisterViewController rvc;

    public void setOnConnected(Runnable onConnected) {
        this.onConnected = onConnected;
    }

    public Client(String ip, int port, LoginViewController lvc) {
        this.ip = ip;
        this.port = port;
        this.lvc = lvc;
    }

    public Client(String ip, int port, RegisterViewController rvc) {
        this.ip = ip;
        this.port = port;
        this.rvc = rvc;
    }

    public void run() {
        try {
            socket = new Socket(ip, port);
            oos = new ObjectOutputStream(socket.getOutputStream());
            ois = new ObjectInputStream(socket.getInputStream());
            if(onConnected != null) {
                onConnected.run();
            }
            while (true) {
                try {
                    Object obj = ois.readObject();
                    if (obj instanceof Login) {
                        String loginStatus = ((Login) obj).getLoginStatus();
                        lvc.setLoginStatus(loginStatus);
                    }
                    else if(obj instanceof Register) {
                        String registerStatus = ((Register) obj).getRegisterStatus();
                        rvc.setRegisterStatus(registerStatus);
                    }
                } catch (IOException | ClassNotFoundException e) {
                    e.printStackTrace();
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void sendToServer(Object obj) {
        try {
            oos.writeObject(obj);
            oos.flush();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
灌篮高手

执行以下代码后问题解决:

登录视图控制器.java

    if(loginStatus.equals("success")) {
        main.showClientView(client); // Passing the client-object to showClientView method
    }

主程序

public static void showClientView(Client client) throws IOException { // Taking the client-object as an argument from LoginViewController
    FXMLLoader loader = new FXMLLoader();
    loader.setLocation(Main.class.getResource("ClientView.fxml"));
    mainLayout = loader.load();

    ClientViewController cvc = loader.getController(); // This did the "trick"
    cvc.setClient(client); // Passing the client-object to the ClientViewController

    Scene scene = new Scene(mainLayout, 900, 600);
    primaryStage.setScene(scene);
    primaryStage.setResizable(true);
    primaryStage.show();
}

客户端视图控制器.java

public void setClient(Client client) { // Setting the client-object in ClientViewController
    this.client = client;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何将用户对象从一个控制器传递到不同的 JavaFX 控制器?

如何在angularjs中将对象数据从一个控制器传递到另一个控制器

如何将对象从一个控制器传递到另一控制器

我如何使用JavaFX中另一个控制器的组件(panel,anchorpane)

JavaFx控制器将对象设置为另一个控制器

JavaFX-如何在另一个控制器中的一个控制器中使用方法?

JavaFX:如何从另一个控制器关闭舞台

在初始化另一个控制器时使用一个控制器的变量时,会出现NullPointerException和LoadException。JavaFX

如何通过重定向URL将模型属性对象的值从一个控制器传递到另一个控制器

如何从一个控制器到另一个控制器共享阵列

如何将数据从一个视图控制器传递到另一个视图控制器,并且在视图控制器之间有一个显示视图控制器

如何在 Rails 中将控制权从一个控制器传递到另一个控制器?

如何使用Laravel将变量从一个控制器传递到另一个控制器

如何将数据从一个视图控制器传递到另一个?

如何将响应从一个控制器传递到另一个?

如何将数据从一个视图控制器传递到另一个SWIFT

使用Firebase将图像从一个视图控制器传递到另一个(swift)

从 MainApp 如何在 JavaFX 中的另一个控制器中的 fx:id 中显示内容

从AngularJS如何将数据从一个控制器+模板传递到另一个控制器+模板?

在我的情况下,如何将数据从一个控制器传递到另一个控制器

如何在ASP MVC设置中将AngularJS中的变量从一个控制器传递到另一个控制器?

AngularJS-如何通过ng-click()将数据从一个控制器传递到另一个控制器?

如何将请求实例从一个控制器功能传递到另一个控制器功能

如何将大字符串从一个控制器传递到另一个控制器?

如何在 LARAVEL 中将值从一个控制器传递到另一个控制器?

如何在CakePHP 3中将数据从一个控制器传递到另一个控制器?

如何将 NSMutableDictionary 从一个视图控制器传递到另一个视图控制器?

如何将 FXML ComboBox 实例从一个控制器传递到另一个控制器?

如何将脆弱数据(例如连接字符串)从一个控制器传递到另一个控制器