JProgressBar не прогрессирует
Поэтому я пытаюсь сделать загрузчик, который показывает прогресс загрузки с индикатором выполнения. Но у меня проблемы, так как он на самом деле не обновляет индикатор выполнения. В основном это остается белым, когда это должно быть синим. Если кто-то может помочь, код ниже.
JProgressBar progressBar = new JProgressBar(0, ia);
con.add(progressBar, BorderLayout.PAGE_START);
con.validate();
con.repaint();
progressBar = new JProgressBar(0, ia);
progressBar.setValue(0);
System.out.print("Downloading Files");
while ((count = in.read(data, 0, downloadSpeed)) != -1){
fout.write(data, 0, count);
if (count >= 2){
progressBar.setString("Downloading : " + ia + " @ " + count + "Kbs per second");
} else {
progressBar.setString("Downloading : " + ia + " @ " + count + "Kb per second");
}
progressBar.setValue(count);
con.add(progressBar, BorderLayout.PAGE_START);
try{
Thread.sleep(1000);
} catch (Exception e){}
}
2 ответа
Используйте комбинацию с SwingWorker. Смотрите пример здесь: SwingWorker и Progress Bar
@ Ховеркрафт: Ты прав. Позвольте мне обратиться к соответствующей странице SwingWorker JavaDoc, на мой взгляд, это лучше всего объясняет ситуацию.
Как отметил @happyburnout, вам лучше обрабатывать загрузку в отдельном потоке, и, вероятно, использование SwingWorker - лучшее решение для ваших действий.
Основная причина заключается в том, что вы блокируете запуск потока диспетчеризации событий (AKA EDT), предотвращая обработку любых запросов на перерисовку (и других важных элементов пользовательского интерфейса).
Вы должны прочитать
Теперь это почти напрямую взято из документации по API, но дает общее представление о SwingWoker
с JProgressBar
Работник"...
public class Worker extends SwingWorker<Object, Object> {
@Override
protected Object doInBackground() throws Exception {
// The download code would go here...
for (int index = 0; index < 1000; index++) {
int progress = Math.round(((float)index / 1000f) * 100f);
setProgress(progress);
Thread.sleep(10);
}
// You could return the down load file if you wanted...
return null;
}
"Панель прогресса"
public class ProgressPane extends JPanel {
private JProgressBar progressBar;
public ProgressPane() {
setLayout(new GridBagLayout());
progressBar = new JProgressBar();
add(progressBar);
}
public void doWork() {
Worker worker = new Worker();
worker.addPropertyChangeListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
if ("progress".equals(evt.getPropertyName())) {
progressBar.setValue((Integer) evt.getNewValue());
}
}
});
worker.execute();
}
}
Помните золотые правила свинга
- Никогда, никогда, никогда не обновляйте компонент пользовательского интерфейса из любого
Thread
другой тогда EDT - Всегда выполняйте трудоемкие задачи на другом
Thread
- (Что-то, что-то, что-то о менеджерах верстки - это больше личное дело;))
И вам будет приятно и легко с Swing:D