【问题标题】:TimerTask can't update the JavaFX Label textTimerTask 无法更新 JavaFX 标签文本
【发布时间】:2013-12-14 15:17:12
【问题描述】:

我有一个fairly simple JavaFX GUI application,它有一个标签,显示距离某个动作开始还剩多少时间。为此,我创建了一个 DownloadTimer 类,如下所示:

public class DownloadTimer(){
    private int minutes;        
    private int seconds;
    private Timer innerTimer = new Timer();
    private TimerTask innerTask;
    private boolean isActive;

    public DownloadTimer(int minutes, int seconds) {
        if (seconds > 60) {
            int minToAdd = seconds / 60;
            this.minutes = minutes;
            this.minutes += minToAdd;
            this.seconds = seconds % 60;
        } else {
            this.minutes = minutes;
            this.seconds = seconds;
        }
    }

    public void start() {
        innerTask = new TimerTask() {
            @Override
            public void run() {
                isActive = true;
                System.out.println(getTime());
                if (seconds == 0 && minutes > 0){
                    minutes -= 1;
                    seconds = 59;
                } else if (seconds == 0 && minutes == 0){
                    isActive = false;
                    innerTimer.cancel();
                    innerTimer.purge();
                    System.out.println("DownloadTimer DONE");
                } else {
                    seconds -= 1;
                }     
            }
        };
        innerTimer.scheduleAtFixedRate(innerTask, 0, 1000);
    }
}

然后,我正在创建 DownloadTimer 对象并从我的 Main (JavaFX) 类开始倒计时:

/* 
    code omitted for better readability 
*/

downloadTimer = new DownloadTimer(0, 5);

// label gets the .getTime() value, which returns a formatted String like "00:05", "00:04", etc.
lblTimer.setText( downloadTimer.getTime() );

// start the countdown
downloadTimer.start();

// create a new timer which checks if the downloadTimer is still counting
final Timer timer = new Timer();
TimerTask timerTask = new TimerTask(){
    @Override
    public void run(){
        if (downloadTimer.getIsActive() == false){
            timer.cancel();
            timer.purge();
            System.out.println("GUI timer DONE");
        } else {
            // if it's still running, then continuously update the label's text
            lblTimer.setText( downloadTimer.getTime() );
            // this is where I get the error described below
        }
    }
};
// repeat after 1000ms
timer.scheduleAtFixedRate(timerTask, 0, 1000);

我遇到的问题是我无法使用 Main 类中的 lblTimer.setText( downloadTimer.getTime() ); 设置标签文本,我得到的错误是 TimerThread.run() line: not available [local variables unavailable] as seen here

我读过ScheduledThreadPoolExecutorJava Timer vs ExecutorService,但我很好奇这是否可以使用两个单独的Timer 和TimerTasks 来完成。任何帮助和/或提示将不胜感激。

【问题讨论】:

    标签: java multithreading timer javafx-2 timertask


    【解决方案1】:

    我很惊讶您没有看到异常。要从单独的线程更新标签,需要安排更新在 FX 线程中运行:

    Platform.runLater(new Runnable() {
        public void run() {
            lblTimer.setText(downloadTimer.getTime());
        }
    });
    

    【讨论】:

    • 完美运行!到目前为止,我一直在努力解决这个问题三天。谢谢!
    • @E.Normous 不客气!我拉头发的最高利润是 2 小时 - 在此之后我开始寻找建议...... :-)
    猜你喜欢
    • 1970-01-01
    • 2018-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-22
    • 1970-01-01
    相关资源
    最近更新 更多