我的button.setText()
方法遇到了一个奇怪的问题。
我检查了时间轴类和服务,它们是Java8特定但没有获胜。
我正在尝试使用倒计时消息"Updated. Restarting in 5,4,3,2,1 seconds..."
点击按钮后,我在Update/Cancel
Vbox按钮的代码是:
final Button updateButton = new Button("Update");
updateButton.setOnAction(update -> {
new UpdateChecker().update();
restartStopwatch(mainUpdateButton);
mainUpdateButton.setDisable(true);
dialog.close();
});
final Button cancelButton = new Button("Cancel");
cancelButton.setOnAction(close -> dialog.close());
然后是restartStopwatch代码:
private void restartStopwatch(Button button) {
final Timer restartTimer = new Timer();
final TimerTask updateRestartTimerTask = new TimerTask() {
int time = 5;
@Override
public void run() {
button.setText("Updated. Restarting in: " + time + " Seconds...");
time--;
if (time <= 0) {
restartTimer.cancel();
new UpdateChecker().restartApplication();
}
}
};
restartTimer.schedule(updateRestartTimerTask, 0, 1000);
}
当我button.setText("anything");
中的private void restartStopwatch(Button button)
作为Updated. Restarting in 5 seconds...
中的第一件事时,奇怪的部分就会出现,然后按钮被设置为button.setText("sfrhgd)
并且它不会倒计时但如果我不这样做1}}将mainUpdateButton.setOnAction(event -> {
try {
final Stage dialog = new Stage();
dialog.initStyle(StageStyle.UTILITY);
dialog.initOwner(stage);
dialog.setResizable(false);
VBox dialogVbox = new VBox(20);
String releaseNotes = IOUtils.toString(new FileReader(new File("ReleaseNotes.txt")));
dialogVbox.getChildren().add(new Text(releaseNotes));
final Button updateButton = new Button("Update");
updateButton.setOnAction(update -> {
new UpdateChecker().update();
restartStopwatch(mainUpdateButton);
mainUpdateButton.setDisable(true);
dialog.close();
});
final Button cancelButton = new Button("Cancel");
cancelButton.setOnAction(close -> dialog.close());
dialogVbox.getChildren().add(updateButton);
dialogVbox.getChildren().add(cancelButton);
Scene dialogScene = new Scene(dialogVbox, 400, 350);
dialog.setScene(dialogScene);
dialog.show();
} catch (IOException e) {
logger.error("Problem occured", e);
}
});
return mainUpdateButton;
}
private void restartStopwatch(Button button) {
final Timer restartTimer = new Timer();
final TimerTask updateRestartTimerTask = new TimerTask() {
int time = 5;
@Override
public void run() {
button.setText("Updated. Restarting in: " + time + " Seconds...");
time--;
if (time <= 0) {
restartTimer.cancel();
new UpdateChecker().restartApplication();
}
}
};
restartTimer.schedule(updateRestartTimerTask, 0, 1000);
}
设置为方法中的第一件事,它根本没有设置它。
它也没有任何例外。我一直在阅读,一些线程无法访问JavaFx的东西,但我找不到解决方案。我希望我解释得足够接近。
整个代码如下所示:
<asp:Table ID="InfosTable" CssClass="table table-bordered table-hover table-striped"
runat="server" CellPadding="0" CellSpacing="0">
<asp:TableHeaderRow ID="TableHeaderRow1" runat="server" ForeColor="Snow" BackColor="OliveDrab"
Font-Bold="true">
</asp:TableHeaderRow>
</asp:Table>
答案 0 :(得分:1)
我不确定你为什么会得到你描述的确切行为:当你从后台线程调用IllegalStateException
时,它真的应该抛出button.setText(...)
。
使用Timeline
:
private void restartStopwatch(Button button) {
Timeline timeline = new Timeline();
for (int i = 0; i <= 5; i++) {
final int timeRemaining = 5 - i ;
KeyFrame frame = new KeyFrame(Duration.seconds(i),
e -> button.setText("Updated. Restarting in: " + timeRemaining + " Seconds..."));
timeline.getKeyFrames().add(frame);
}
timeline.setOnFinished(e -> new UpdateChecker().restartApplication());
timeline.play();
}
答案 1 :(得分:0)
你需要创建一个任务(它是一个后台JavaFX线程)来处理倒计时并将文本放在你的按钮上:
final Task task = new Task<Void>() {
@Override
protected Void call() throws Exception {
//Countdown code here
return null;
}
};
new Thread(task).start();
您可以在官方文档中阅读有关任务的更多信息: https://docs.oracle.com/javafx/2/api/javafx/concurrent/Task.html