这似乎是一个非常基本的问题,答案就在我面前,但我仍然无法弄清楚出了什么问题。我有一个按钮,当处理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();
}
}
答案 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
Platform.runLater(() -> {
loginStatus.setStyle("-fx-text-fill:#009933");
loginStatus.setText("Online");
}) ;