powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / GUI зависает при загрузке файла
8 сообщений из 8, страница 1 из 1
GUI зависает при загрузке файла
    #37833283
TAXD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток.
Проблема:
Программа при нажатии на кнопку начинает загружать файл и сохраняет его в нужную папку. Во время этой загрузки хотелось бы отображать статус загрузки (Сколько загружено/Сколько осталось загрузить), но никак не получается это реализовать, не хватает опыта (JAVA начал учить всего 10 дней назад).
Исходный код
Кнопка, при нажатии на которую начинается загрузка файла:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
	    
	but2.addActionListener(new ActionListener() {
               public void actionPerformed(ActionEvent event) {

                     jtxtform1.setText("<html><font size=\"5px\" color=\"ff7d7d\">Начинается загрузка архива...</font></html>");

       URL url = new URL("http://site.ru/game.zip");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();

BufferedInputStream bis = new BufferedInputStream(conn.getInputStream());
File f1 = new File("D:\\craftbukkit.jar");
FileOutputStream fw = new FileOutputStream(f1);
byte[] b = new byte[1024];
int count = 0;

                     while ((count=bis.read(b)) != -1) {
fw.write(b,0,count);
        }
fw.close();
} catch (IOException ex) {
}
       }
       });



- Тут проблема в том, что надпись "Начинается загрузка архива..." выводится только после загрузки файла, и всё это время пользователь думает что программа просто зависла.

- И самое главное: Подскажите, пожалуйста, как можно во время загрузки файла можно вывести для пользователя хоть какую то информацию? Допустим я создал JProgressBar но никак не могу во время загрузки его изменять, ибо не знаю как, а если делать это в самом event'e то GUI просто зависает до времени пока файл не загрузится. Помогите, заранее большое спасибо!
...
Рейтинг: 0 / 0
GUI зависает при загрузке файла
    #37833344
Leonidv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TAXD,

swingworker
...
Рейтинг: 0 / 0
GUI зависает при загрузке файла
    #37833486
Kripke
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
GUI зависает при загрузке файла
    #37833515
ResidentR6
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Такую работу нужно делать в отдельном потоке. Иначе вполне логично
вешаешь поток GUI. Если не умеешь работать в потоках - останавливай всю
работу, иди изучай вопрос. Это ключевое знание, без него ты не
программист. Потоки используются всегда и при любой потребности.

На будущее: если тебе кажется, что где-то что-то висит - тупо логируй
время (разницу от точки старта в мс) после каждой операции. Заведи
отдельный статик-метод, заведи для него реакцию на какие-то тестовые
данные, дабы он тебе потом не засрал боевые логи. Этим сэкономишь туеву
хучу времени.

Есть и много других методов. Но это - решение "в лоб", универсально.
Особенно когда ошибка не в твоём коде.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
GUI зависает при загрузке файла
    #37833599
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ResidentR6
Такую работу нужно делать в отдельном потоке. Иначе вполне логично
вешаешь поток GUI. Если не умеешь работать в потоках - останавливай всю
работу, иди изучай вопрос. Это ключевое знание, без него ты не
программист. Потоки используются всегда и при любой потребности.



Почему-то Java -программисты уверены, что на всё нужно обязательно создавать отдельный поток.
Вообще-то для такой херни поток создавать -- идиотизм.
А надо просто тупо заставить SWING перерисовать обновлённый контрол. Там есть какой-то PaintEvent,
возможно надо послать и обработать его. Возможно, это непросто. Но это правильно.

Возможно, можно как-то сначала запихать сообщение в контрол, потом
поставить в очередь обработки событий событие типа "давай сделай ЭТО",
и уже на обработке этого события, после того, как оно отрисует контрольчик,
выполнять действие с файлом.

Совет изучить работу с потоками конечно же правильный. Но для программирования GUI
потоки почти не нужны.
...
Рейтинг: 0 / 0
GUI зависает при загрузке файла
    #37833700
Kripke
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZivСовет изучить работу с потоками конечно же правильный. Но для программирования GUI
потоки почти не нужны.
Вот по-моему очень даже нужны. Что касается Swing, то там основное правило, чтобы сделать "отзывчивый" интерфейс - всю долгую обработку выполнять в отдельном потоке, а не в Event Dispatch Thread.
...
Рейтинг: 0 / 0
GUI зависает при загрузке файла
    #37833754
ResidentR6
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Потоки нужны по-любому. Задача потоков не просто наплодить
синхронизаций, а исключительно в ом, чтобы ОСВОБОДИТЬ поток, и выбросить
задачу с зависимостями от внешних факторов - в отдельный поток.

То же самое чтение файла - операция с диском в 1000 и более раз затратна
по времени, чем та же операция с памятью. Про операцию с сетью и
говорить не приходится. Ну не должен поток прорисовки ждать, пока сервак
соизволит отдать данные, а сеть безошибочно их передать. За те NN секунд
что комп ждёт ответа сети, юзер видит зависшую программу, и угадайте что
с ней делает?

Программист обязательно должен уметь освобождать потоки, перекладывая
задачи в новый. А если работает со Swing - просто обязан на них молиться.

Единственный момент - диалоговые окна, в частности выбора файла, надо
открывать в потоке Свинга. А вот уже получив нужные данные, поднять
прогресс бар и работать с файлом.

Делается это элементарно.

final File f = полученный от диалога файл;
new Thread(){public void run(
try{
try{
работа с файлом
}finally{закрыть прогресс-бар; закрыть файл}
}cacth(Throwable th){сообщить юзеру об ошибке}
){}}.start();

PS. Не забыть в новом потоке finally прибить прогресс бар, а также
удостовериться что закрыли перед выводом сообщения эксепшена (иначе
сообщение накроется прогрессбаром).
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
GUI зависает при загрузке файла
    #37833789
TAXD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо всем кто помог, проблема решена. Точнее даже не проблема, а моё не знание :)
Вот, если кому нужно будет, ещё статья по этому поводу + Сразу скажу, решение - SwingWorker, гуглите, обязательно найдёте:
http://www.skipy.ru/technics/gui_sync.html#practics
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / GUI зависает при загрузке файла
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]