Реализация SwingWorker - PullRequest
       2

Реализация SwingWorker

1 голос
/ 23 февраля 2012

Мысль о создании небольшого текстового редактора. Он будет содержать две текстовые области: одну для ввода текста и одну для отображения ошибок. Насколько я понимаю, SwingWorker работает в фоновом режиме, поэтому не будет никаких задержек в обновлении пользовательского интерфейса. Для проверки я написал приведенный ниже код, вставил 5000 строк и попытался напечатать, я думаю, что по мере увеличения строки обновление в textEditor2 становится очень медленным. Правильно ли реализована работа свингера в коде?

textEditor1 и textEditor2 - это JTextarea

 private void editorKeyPressed(java.awt.event.KeyEvent evt) {

SwingWorker worker = new SwingWorker<Void, Void>() {
    String text = null;

    @Override
    protected Void doInBackground() throws Exception {
        text = textEditor1.getText().toString();
        return null;
    }

    @Override
    protected void done() {
        try {
            get();
            textEditor2.setText(text);
        } catch (Exception ex) {
            System.out.println(ex);
        }
    }
};

worker.execute();   
}

Ответы [ 2 ]

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

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

Вам все еще нужно управлять количеством потоков, которые вы выполняете для поддержки пользовательского интерфейса.ответная реакция.Если вы хотите, чтобы фоновая задача всегда выполнялась, настройте собственный поток и используйте класс из параллельного пакета, чтобы облегчить передачу данных из потока события (например, ArrayBlockingQueue ).

0 голосов
/ 23 февраля 2012

Для этой задачи вы не должны использовать SwingWorker.Просто сделай это в один поток.

private void editorKeyPressed(java.awt.event.KeyEvent evt) {
text = textEditor1.getText();
textEditor2.setText(text);
}
...