setText и setValue не работают должным образом - PullRequest
0 голосов
/ 31 декабря 2011

Я пытаюсь создать простую программу, которая будет загружать несколько файлов для меня на общий ресурс Windows. У меня есть все основные функции, но у меня есть проблемы с некоторыми штрихами. У меня есть графический интерфейс, и я просто хочу показать некоторую информацию о загрузке - индикатор выполнения и метку. Вот код:

private void btn_UploadActionPerformed(java.awt.event.ActionEvent evt) {

    upl.setFiles(files);

    for(int i = 0; i < files.length; i++){
        progressLabel.setText("Uploading " + files[i].getName());
        upl.uploadFile(i);
        uploadProgress.setValue(uploadProgress.getValue() + 90/files.length);

    }

    uploadProgress.setValue(100);

}

Это выполняется, когда пользователь нажимает кнопку загрузки. Проблема в том, что setText и setValue не работают должным образом. Когда я нажимаю кнопку загрузки, загрузка начинается (и заканчивается), но текст на этикетке не меняется, как и индикатор выполнения. Они изменяются только после завершения загрузки.

Весь исходный код можно найти здесь: Код

Есть предложения? Постскриптум В относительно новых на Java:)

Ответы [ 2 ]

4 голосов
/ 31 декабря 2011

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

Используйте SwingWorker, чтобы делать то, что вы хотите. Его Javadoc имеет простой для понимания пример.

3 голосов
/ 31 декабря 2011

Я второй JB Nizet, В некоторых случаях использование фонового потока вместо потока диспетчеризации событий предотвращает зависание пользовательского интерфейса во время выполнения задачи.

FYI из учебных пособий по Java,

Программист Swing имеет дело со следующими видами потоков:

  • Начальные потоки , потоки, которые выполняют исходный код приложения.

  • Поток диспетчеризации событий , где выполняется весь код обработки событий.Большая часть кода, взаимодействующего с платформой Swing, также должна выполняться в этом потоке.

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