Подтвердить что ты не робот

Динамически обновлять JTextArea при обработке?

Я пытаюсь создать очень простой пользовательский интерфейс Swing, который регистрирует информацию на экране через JTextArea, поскольку обработка происходит в фоновом режиме. Когда пользователь нажимает кнопку, я хочу, чтобы каждый вызов:

textArea.append(someString + "\n");

чтобы сразу отображаться в пользовательском интерфейсе.

В настоящий момент JTextArea не отображает всю информацию журнала до тех пор, пока обработка не завершится после нажатия кнопки. Как я могу заставить его обновляться динамически?

4b9b3361

Ответ 1

Я столкнулся с той же проблемой с моим приложением. У меня была кнопка "Запустить" мое приложение, которое выполняло некоторые действия и выводило результаты в JTextArea. Мне пришлось вызвать метод из Thread. Вот что я сделал.

У меня есть несколько переключателей действий, которые можно выполнить, а затем одну кнопку "Запустить" , чтобы выполнить это конкретное действие. У меня есть действие под названием Validate. Поэтому, когда я проверяю этот переключатель и нажимаю кнопку "Запустить" , он вызывает метод validate(). Поэтому я сначала поместил этот метод во внутренний класс, который реализовал Runnable

class ValidateThread implements Runnable {
    public void run() {
        validate();
    }
}

Затем я назвал этот поток в ActionListener кнопки "Run" таким образом

runButton.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent ae) {
        // Some code checked on some radio buttons
        if(radioButton.isSelected()) {
            if(radioButton.getText().equals("VALIDATE")) {
               Runnable runnable = new ValidateThread();
               Thread thread = new Thread(runnable);
               thread.start();
            }
        }
    }

});

Voila! Теперь вывод отправляется в JTextArea.

Теперь вы заметите, что JTextArea не будет прокручиваться вниз с текстом. Поэтому вам нужно установить положение каретки, например

textArea.setCaretPosition(textArea.getText().length() - 1);

Теперь, когда данные добавляются в JTextArea, он всегда будет прокручиваться вниз.

Ответ 2

Попробуйте следующее:

jTextArea.update(jTextArea.getGraphics());

Ответ 3

Как говорили другие, для этого требуется многопоточность. Посмотрите Concurrency в Swing.

Одним из решений было бы реализовать обработку с помощью SwingWorker. Метод doInBackground будет реализовывать обработку, и вы будете ссылаться на метод публикации со строкой, которая будет добавлена ​​в качестве аргумента. Затем ваш SwingWorker переопределит метод процесса, чтобы принять аргумент String и добавить его в текстовую область.

Ответ 4

Прошу прощения за ответ на этот вопрос, который был опубликован 4 года назад, но у меня есть другое решение, которое сработало для меня. Я просто использовал указатели для обновления JTextArea как такового:

//JScrollPane variable pane initialized with JTextArea area
//We will update area with new text
JTextArea temp = (JTextArea) pane.getViewPort().getView();
//new text to add
JTextArea c = new JTextArea();
c.append("text \n)";
//update through pointers
temp = c;
pane.validate();

Ответ 5

Для этого вам понадобится многопоточность. Готовы ли вы окунуться?