java主应用程序线程在到达方法末尾之前不更新GUI
我在应用程序中有一个连接按钮,在堆栈窗格上有两个窗格。第一个窗格是chatPane,第二个窗格是带有的加载程序。以他的背景为背景
我想做的是在单击“连接”之后,我想显示加载程序(在其背景上移动gif),然后等待,直到委派。connectToServer(…)方法结束,然后关闭loader窗格并切换回chatPane
在当前代码中,javaFX应用程序线程似乎没有可视化对GUI所做的更改,直到它到达connectClicked()方法的末尾,这意味着加载程序窗格没有被显示
我尝试在线程中以任务的形式运行setConnectionStatus方法的内容,但在执行此操作时,通过Label对象的setText方法收到了Not On fx application thread
异常,不过加载程序gif显示得很好
我还尝试过像这样使用暂停转换:
@FXML
public void connectClicked() {
setConnectionStatus(CONNECTING);
PauseTransition pause = new PauseTransition(Duration.seconds(0.1));
pause.setOnFinished(event -> {
try {
delegate.connectToServer(connectionConfig.getServerAddress().getIp(),
connectionConfig.getServerAddress().getPort(),
connectionConfig.getTimeout());
setConnectionStatus(CONNECTED);
} catch (ConnectionException e) {
setConnectionStatus(DISCONNECTED);
//todo reconnect dialog
} catch (FatalException e) {
handleFatalError("Connection error", e.getMessage());
}
});
pause.play();
}
这导致加载程序窗格显示移动0.1秒,之后动画停止(加载程序窗格保持可见,仅gif停止)
我还尝试用Platform.runLater()
或Thread
包装try-catch块,但没有效果
我不能使用Platform.runLater
来显示加载程序,因为我希望立即执行gui更改,而不是“将来某个时候”
以下是完整的代码:
@FXML public VBox loader;
@FXML public SplitPane chatPane;
@FXML public MenuItem connectMenuItem;
@FXML public MenuItem disconnectMenuItem;
@FXML public Label connectionStatus;
@FXML
public void connectClicked() {
setConnectionStatus(CONNECTING);
try {
delegate.connectToServer(connectionConfig.getServerAddress().getIp(),
connectionConfig.getServerAddress().getPort(),
connectionConfig.getTimeout());
setConnectionStatus(CONNECTED);
} catch (ConnectionException e) {
setConnectionStatus(DISCONNECTED);
//todo reconnect dialog
} catch (FatalException e) {
handleFatalError("Connection error", e.getMessage());
}
}
private void setConnectionStatus(ConnectionStatus status) {
switch (status) {
case CONNECTED:
setStatusLabel("Connected", GREEN);
setConnectionMenu(false, true);
showChatPane();
break;
case DISCONNECTED:
setStatusLabel("Not Connected", RED);
setConnectionMenu(true, false);
showChatPane();
break;
case CONNECTING:
setStatusLabel("Connecting...", BLUE);
setConnectionMenu(false, false);
showLoader();
break;
case DISCONNECTING:
setStatusLabel("Disconnecting...", BLUE);
setConnectionMenu(false, false);
showLoader();
break;
}
}
private void setStatusLabel(String text, Color color) {
connectionStatus.setText(text);
connectionStatus.setTextFill(color);
}
private void setConnectionMenu(boolean isConnectEnabled, boolean isDisconnectEnabled) {
connectMenuItem.setDisable(!isConnectEnabled);
disconnectMenuItem.setDisable(!isDisconnectEnabled);
}
private void showLoader() {
chatPane.setVisible(false);
loader.setVisible(true);
}
private void showChatPane() {
chatPane.setVisible(true);
loader.setVisible(false);
}
# 1 楼答案
看起来用线程包装try-catch-block起作用了,因为我用的是线程,所以之前没有起作用。运行()而不是线程。开始()
我还必须添加平台。稍后在线程体中运行
setConnectionStatus
方法