JTextPane живость - PullRequest
       21

JTextPane живость

3 голосов
/ 10 февраля 2012

Приложение My Swing печатает строки текста в JTextPane внутри JScrollPane при нажатии JButton. Для быстрых операций это не проблема. Однако некоторые JButtons вызывают операции, которые могут занимать несколько минут. Кнопка остается серой в течение этого времени.

В настоящее время происходит то, что текст «пакетируется», и тогда я получаю сотни строк сразу в конце операции в тот же момент, когда кнопка становится серой. Проблема в том, что я хотел бы, чтобы текст, добавляемый к документу, отображаемому в JTextPane, появлялся раньше (в момент его добавления), а не во время завершения всей операции. Это создаст лучший пользовательский опыт.

Что я делаю не так?

Ответы [ 2 ]

2 голосов
/ 10 февраля 2012

Используйте SwingWorker для выполнения фоновой операции.

// Your button handler
public void actionPerformed(ActionEvent e) {
  (new SwingWorker<Void, String>() {
    public Void doInBackground() {
      // perform your operation
      // invoke publish("your string");
    }

    protected void process(List<String> chunks) {
      // append your string to the scroll pane
    }
  }).execute();
}
1 голос
/ 10 февраля 2012

Вы вызываете код непосредственно из AWT-Thread, который блокирует каждое событие.Решение состоит в том, чтобы поместить ваш долгосрочный код в отдельный Thread.Когда ваш код выполняется и получает результаты, вы уведомляете свое представление (используя шаблон наблюдателя / наблюдаемого). Когда ваше представление уведомляется, вы обновляете содержимое полосы прокрутки.

Вы также должны проверить, выполняете ли выAWT-Thread или нет (SwingUtilities.isEventDispatchThread()).Если это не так, вам нужно отправить обновление представления в AWT-Thread с помощью SwingUtilities.invokeLater(), поскольку Swing не является поточно-ориентированным.

...