JavaFx按钮设置带有计时器任务的文本

时间:2016-01-18 14:27:39

标签: java javafx

我的button.setText()方法遇到了一个奇怪的问题。 我检查了时间轴类和服务,它们是Java8特定但没有获胜。

我正在尝试使用倒计时消息"Updated. Restarting in 5,4,3,2,1 seconds..."

更新按钮(负责使用遥控器中的文件更新应用)

点击按钮后,我在Update/Cancel

中找到了包含发行说明和2个按钮的Vbox

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)并且它不会倒计时但如果我不这样做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>

2 个答案:

答案 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