为了账号安全,请及时绑定邮箱和手机立即绑定

JavaFx TextArea 在循环中调用 appendText() 时冻结

JavaFx TextArea 在循环中调用 appendText() 时冻结

泛舟湖上清波郎朗 2022-08-03 10:21:14
所以我试图从循环非常频繁地更新文本区域// This code makes the UI freez and the textArea don't get updatedfor(int i = 0; i < 10000; i++){    staticTextArea.appendText("dada \n");}我还尝试实现一个BlockingQueue来创建更新TextArea的任务,这解决了UI的冻结问题,但TextArea在大约一百个循环后停止更新,但同时System.out.print(“dada \n”);按预期工作。    private static final BlockingQueue<Runnable> queue = new ArrayBlockingQueue<>(100);    private static Thread mainWorker;    private static void updateTextArea() {        for(int i = 0 ; i < 10000; i++) {            addJob(() -> {                staticTextArea.appendText("dada \n");                System.out.print("dada \n");            });        }    }    private static void addJob(Runnable t) {        if (mainWorker == null) {            mainWorker = new Thread(() -> {                while (true) {                    try {                        queue.take().run();                    } catch (InterruptedException e) {                        e.printStackTrace();                    }                }            });            mainWorker.start();        }        queue.add(t);    }
查看完整描述

1 回答

?
潇潇雨雨

TA贡献1833条经验 获得超4个赞

发生这种情况是因为你阻止了 UI 线程。


JavaFX 提供了该类,该类公开了该方法。该方法可用于在 JavaFX 应用程序线程(与 UI 线程不同)上运行长时间运行的任务。PlatformrunLater


final Runnable appendTextRunnable = 

      () -> {

         for (int i = 0; i < 10000; i++) {

            staticTextArea.appendText("dada \n");

         }

      };


Platform.runLater(appendTextRunnable);


查看完整回答
反对 回复 2022-08-03
  • 1 回答
  • 0 关注
  • 87 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信