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

所以我试图从循环非常频繁地更新文本区域


// This code makes the UI freez and the textArea don't get updated

for(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);

    }


泛舟湖上清波郎朗
浏览 88回答 1
1回答

潇潇雨雨

发生这种情况是因为你阻止了 UI 线程。JavaFX 提供了该类,该类公开了该方法。该方法可用于在 JavaFX 应用程序线程(与 UI 线程不同)上运行长时间运行的任务。PlatformrunLaterfinal Runnable appendTextRunnable =&nbsp;&nbsp; &nbsp; &nbsp; () -> {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;for (int i = 0; i < 10000; i++) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; staticTextArea.appendText("dada \n");&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}&nbsp; &nbsp; &nbsp; };Platform.runLater(appendTextRunnable);
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java