javaFX——非UI线程界面更新问题

背景: javaFX的项目,上一篇文章中说过处理的数据量比较大,所以计算过程很慢,大概需要一两分钟的计算。过程中进程锁死,会无响应,并且不能显示计算进度。

解决方案:开一个线程计算,其他功能依然可用,然后在非UI线程更新界面,显示计算进度。

具体方案:写一个类,继承Thread,然后启动(注:这里可以通过类中的get方法,传出线程中的结果),这里有三种办法,在非UI线程更新界面
(1)javaFX提供了一个函数,可以在非UI线程更新界面,如果试图在线程中直接更新界面,会报异常(亲测有用)

Platform.runLater(()->scheduleLabel.setText("0%"));

注:这里使用了lambda表达式

(2)JavaFX提供的Timeline类(未亲测,查到有这种方法)

new Timeline(new KeyFrame(
        Duration.millis(2500),
        ae -> doSomething()))
    .play();

(3)JavaFX自带的progressBar类,本质上用的是task更新的UI,所以也可以说是task方式(亲测可行)

    public Task createWorker() {
        return new Task() {
            @Override
            protected Object call() throws Exception {
                for (int i = 0; i < 10; i++) {
                    Thread.sleep(200);
//                    updateMessage("2000 milliseconds");
                    updateProgress(i + 1, 10);
                }
                return true;
            }
        };
    }
    //调用
Task copyWorker = createWorker();
progressBar.progressProperty().unbind();                progressBar.progressProperty().bind(copyWorker.progressProperty());

后记: 我后来试图在一个完全占有的方式下更新UI界面,用了上述三种方式加上直接用Task方式启动一个线程,都失败了。应该是不能在完全占用进程的情况下做其他操作。

参考资料:

方法一, platform.runlater(): https://stackoverflow.com/questions/13351959/javafx-how-to-set-default-active-control/13352107#13352107
JavaFX自带的progressBar进度条:http://www.yiibai.com/javafx/javafx_progressbar.html
TimeLine方式: https://zhidao.baidu.com/question/1988620878344183347.html

你可能感兴趣的:(项目总结)