JavaFx TextArea зависает при вызове appendText () внутри цикла - PullRequest
0 голосов
/ 10 марта 2019

Так что я очень часто пытаюсь обновить TextArea из цикла

// 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, это решило проблему зависания интерфейса, но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 Ответ

2 голосов
/ 10 марта 2019

Это происходит потому, что вы блокируете поток пользовательского интерфейса.

JavaFX предлагает класс Platform, который предоставляет метод runLater. Этот метод можно использовать для запуска долгосрочных задач в потоке приложения JavaFX (который отличается от потока пользовательского интерфейса).

final Runnable appendTextRunnable = 
      () -> {
         for (int i = 0; i < 10000; i++) {
            staticTextArea.appendText("dada \n");
         }
      };

Platform.runLater(appendTextRunnable);
...