Динамически обновлять JTextArea при обработке?
Я пытаюсь создать очень простой пользовательский интерфейс Swing, который регистрирует информацию на экране через JTextArea, поскольку обработка происходит в фоновом режиме. Когда пользователь нажимает кнопку, я хочу, чтобы каждый вызов:
textArea.append(someString + "\n");
чтобы сразу отображаться в пользовательском интерфейсе.
В настоящий момент JTextArea не отображает всю информацию журнала до тех пор, пока обработка не завершится после нажатия кнопки. Как я могу заставить его обновляться динамически?
Ответы
Ответ 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
Для этого вам понадобится многопоточность. Готовы ли вы окунуться?
Ответ 6
Если это многопоточность, попробуйте это!
http://www.devarticles.com/c/a/Java/Multithreading-in-Java/