Динамически обновлять JTextArea по мере обработки? - PullRequest
23 голосов
/ 10 марта 2009

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

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

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

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

Ответы [ 6 ]

39 голосов
/ 17 октября 2009

Попробуйте это:

jTextArea.update(jTextArea.getGraphics());
24 голосов
/ 10 марта 2009

Я столкнулся с той же проблемой с моим приложением. У меня была кнопка «Выполнить» моего приложения, которая выполняла некоторые действия и выводила результаты в JTextArea. Я должен был вызвать метод из потока. Вот что я сделал.

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

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

Затем я вызвал эту ветку в ActionListener кнопки «Выполнить» так:

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

});

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

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

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

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

4 голосов
/ 10 марта 2009

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

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

1 голос
/ 29 мая 2013

Я прошу прощения за ответ на этот вопрос, который был опубликован 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();
0 голосов
/ 10 марта 2009

Если вам нужна многопоточность, попробуйте это! http://www.devarticles.com/c/a/Java/Multithreading-in-Java/

0 голосов
/ 10 марта 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...