JavaFX按钮句柄()不调用方法

时间:2016-02-13 18:49:49

标签: java events javafx label

这似乎是一个非常基本的问题,答案就在我面前,但我仍然无法弄清楚出了什么问题。我有一个按钮,当处理click事件时,我更改了Label的样式和文本。之后,我调用一个方法,在完成后再次更改样式。

我的问题是handle()方法中的样式更改不会影响我的标签,而是直接从其默认样式转到connect()设置的样式。

请注意,这不是因为它变化太快,connect()方法通常需要一整秒才能完成,因为它连接到远程服务器。

我尝试在setStyle()和connect()之间暂停一下(如果我太慢了),但无济于事。我非常感谢任何帮助,并希望在此过程中学到一些东西。

这是我的代码:

Button loginButton = new Button();

    loginButton.setOnAction(new EventHandler<ActionEvent>() {
        @Override
        public void handle(ActionEvent event) {
            loginStatus.setText("Loggin in...");

            //The line below should change the color until connect does it's thing, but it doesn't
            loginStatus.setStyle("-fx-text-fill:#ffcc00"); 

            connect(username.getText(), password.getText(), serverField.getText());
        }
    });

connect()看起来像这样:

private void connect(String username, String password, String server) {
    try {
        api = new DiscordBuilder(username, password).build();
        api.login();
        api.joinInviteId(server);
        api.getEventManager().registerListener(new ChatListener(api));

        //Instead, it goes straight from the old style to the style set below.
        loginStatus.setStyle("-fx-text-fill:#009933");

        loginStatus.setText("Online");
    } catch (NoLoginDetailsException e) {
        loginStatus.setText("No login details!");
        loginStatus.setStyle("-fx-text-fill:#cc3300");
        e.printStackTrace();
    } catch (BadUsernamePasswordException e) {
        loginStatus.setText("Bad username or password!");
        loginStatus.setStyle("-fx-text-fill:#cc3300");
        e.printStackTrace();
    } catch (DiscordFailedToConnectException e) {
        loginStatus.setText("Failed to connect!");
        loginStatus.setStyle("-fx-text-fill:#cc3300");
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

1 个答案:

答案 0 :(得分:1)

您需要的是Task

同样如here

所述
  

在JavaFX Application线程上实现长时间运行的任务   不可避免地使应用程序UI无响应。最佳做法是   在一个或多个后台线程上执行这些任务并让JavaFX   应用程序线程处理用户事件。

所以你的代码应该是这样的

    Button loginButton = new Button();
    loginButton.setOnAction(new EventHandler<ActionEvent>() {
        @Override
        public void handle(ActionEvent event) {
            loginStatus.setText("Loggin in...");
            //The line below should change the color until connect does it's thing, but it doesn't
            loginStatus.setStyle("-fx-text-fill:#ffcc00"); 
            Task<Void> task = new Task<Void>() {
                @Override
                protected Void call() throws Exception {
                    connect(username.getText(), password.getText(), serverField.getText());
                    return null;
                }
            };
            new Thread(task).start();
        }
    });

并在您的connect方法中使用Platform.runLater

围绕您的ui更新方法
Platform.runLater(() -> {
    loginStatus.setStyle("-fx-text-fill:#009933");
    loginStatus.setText("Online");
}) ;