Обработка GUI с помощью SWING с многопоточностью, когда GUI не обновляет информацию - PullRequest
0 голосов
/ 26 января 2011

Итак, у меня есть настольное приложение, разработанное с использованием паттерна MVC, вдохновленного этим руководством (но слегка измененным).Это приложение должно скопировать список файлов из одного каталога в другой.То, что я хотел бы сделать, это в основном обновлять мой GUI после того, как каждый файл скопирован.

Прежде всего позвольте мне показать вам код.В моей модели у меня есть этот фиктивный метод (не реальный метод, а логика, лежащая в его основе та же самая):

public void dummyMethod(Integer k) throws InterruptedException{
    for(int i=0;i<10;i++){
        System.out.println(i);
    Thread.sleep(1000);
        this.firePropertyChange(DefaultController.BACKUP_DUMMY, i-1, i);
    }
}

На мой взгляд, у меня есть это:Можно представить, что ЧТО? печатается каждый раз, но графический интерфейс не обновляется, пока цикл не завершится.Это классическая проблема, когда вы работаете с SWING и его EDT, и я прочитал на сайте оракула эту статью / руководство , но я не думаю, что мне нужно использовать SwingWorker.Мне просто нужно обновить один компонент в графическом интерфейсе.

Ответы [ 2 ]

3 голосов
/ 26 января 2011

но графический интерфейс не обновляется, пока цикл не закончится.

Это указывает на то, что весь ваш код выполняется на EDT, и, следовательно, графический интерфейс не может перерисоваться, пока не завершится весь цикл.

но я не думаю, что мне нужно использовать SwingWorker.

Почему бы и нет, это, вероятно, самое простое решение. Ваш основной цикл выполняется в отдельном потоке, а затем вы «публикуете» результаты при обработке каждого файла.

Или используйте подход, предложенный Гурзелем. Долгосрочный код выполняется в отдельном потоке, и в EDT происходит только запуск события изменения свойства, что означает, что графический интерфейс пользователя может перерисовываться в EDT.

1 голос
/ 26 января 2011

Не использовать поток диспетчеризации событий для длительной работы.Вы должны запустить другой поток для длительной работы, такой как копирование файлов.Если вам нужно обновить графический интерфейс пользователя из рабочего потока, вам следует использовать методы SwingUtilities.invokeLater или SwingUtilities.invokeAndWait ..

в качестве примера;

final JLabel label = new JLabel();
JButton button = new JButton();
button.addActionListener(new ActionListener() {
    public void actioPerformed(ActionEvent ev) {
         Thread workerThread = new Thread() {
               public void run() {
                     //do long running job then update ui
                   SwingUtilities.invokeLater(new Runnable() {
                           public void run(){
                               label.setText("Operation has finished");
                           }
                    });

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