Java не обновляет текстовое поле внутри цикла

Hy.

После слабого поиска этого ответа, который я (java newbe) не мог понять, я решил спросить. Моя программа состоит из Form JFrame с кнопкой, которая запускает процедуру.

  1. JChooser, чтобы получить папку
  2. Список для получения всех файлов в этой папке

запуск цикла for (цикл) 3. Процесс распаковки каждого из файлов (.tgz). Развернутый tgz показывает .tar 4. Процессор для разворачивания tar. 5. Другой процесс для получения файла .csv из .tar и внесения некоторых изменений. заканчивает для

Все это находится внутри (private void btPegaDirActionPerformed (java.awt.event.ActionEvent evt)). Но у меня есть текстовое поле (имя txtDisplay), и оно обновляется только после процесса отверстия. Хорошо, я знаю, что Swing должен иметь внешний процесс для обновления в реальном времени все время, когда процесс завершается (т.е. unpiz # 1, unzip # 2, change CSV), и я не знаю, как создать внешний процесс.

Вот код.

private void btPegaDirActionPerformed(java.awt.event.ActionEvent evt) {
    JCHooser....
    Get file to array (between 28 to 32 files)

    for (File arqTGZ : files) {
        try {

            unzip tgz (unfolds a tar)
            System.out.println("Unzip OK")
            (must updata java textarea here)

            unzip tar (unfolds a csv)
            System.out.println("Unzip OK")
            (must updata java textarea here)

            change CSV
            System.out.println("CSV Saved")
            (must updata java textarea here)

        }
    }
}

Вот и все. Кто-нибудь может мне помочь, пожалуйста?


person George Emmanuel    schedule 15.09.2014    source источник
comment
Я думаю, вам нужно разбить вашу программу (и ваш вопрос) на более мелкие куски. Попробуйте просто написать бит, который обновляет CSV, не беспокоясь о текстовой области или файле tar. Затем задайте вопрос, если у вас возникнут трудности с этим.   -  person markspace    schedule 15.09.2014


Ответы (1)


Цикл допустим, если не выполнен на Поток отправки пользовательского интерфейса / событий - если длинная задача выполняется непосредственно в потоке пользовательского интерфейса / EDT, то весь рендеринг / взаимодействие прекращается до тех пор, пока операция не завершится, что приведет к зависанию приложения ".

Используйте SwingWorker , как описано в этом курсе, чтобы создать фоновый поток / рабочий, реализующий задачу. Затем используйте связанные свойства и подключите пользовательский интерфейс для прослушивания соответствующий статус от фонового работника. Этот подход (за исключением использования firePropertyChange в настраиваемом свойстве) описан в документация по классу SwingWorker как PrimeNumbersTask.

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

Убедитесь, что поддерживает отмену между действиями и предотвратит [случайное] выполнение нескольких одновременных SwingWorkers, обрабатывающих одну и ту же задачу.

person user2864740    schedule 15.09.2014
comment
Спасибо! Я получил способ. Теперь я понимаю, что процесс должен быть в стороне от основного. Работает очень красиво. Большое спасибо! - person George Emmanuel; 16.09.2014