Графический интерфейс Java заморожен при загрузке файла
public class download {
public static void Download() {
final String saveTo = System.getProperty("user.home").replace("\\", "/") + "/Desktop/";
try {
URL url = null;
url = new URL("http://cachefly.cachefly.net/10mb.test");
ReadableByteChannel rbc = Channels.newChannel(url.openStream());
FileOutputStream fos = new FileOutputStream(saveTo + "10mb.test");
fos.getChannel().transferFrom(rbc, 0, 1 << 24);
} catch (Exception e) {
e.printStackTrace();
}
}
В моем другом классе у меня есть слушатель событий
public void download_buttonActionPerformed(ActionEvent e) {
download_button.setEnabled(false);
label_status.setText("- Downloading...");
download.Download();
}
Когда я нажимаю кнопку в моем графическом интерфейсе, он зависает, и ярлык и кнопка никогда не меняются, пока файл не загружен:
http://img200.imageshack.us/img200/2435/45019860.png
Нужно ли начинать загрузку с новой темы или чего-то еще? Если я запускаю его в новом потоке, возможно ли использовать индикатор выполнения? Я все еще новичок в Java, поэтому я прошу прощения, если я делаю это совершенно неправильно.
3 ответа
Да, вам нужно сделать загрузку в отдельном потоке. На самом деле это позволит вам использовать индикатор выполнения.
Используйте SwingWorker для запуска долгосрочной задачи. Этот учебник поможет с индикатором выполнения: http://download.oracle.com/javase/tutorial/uiswing/components/progress.html
Нужно ли начинать загрузку с новой темы или чего-то еще?
Да. SwingWorker был бы идеальным для этого.
Если я запускаю его в новом потоке, возможно ли использовать индикатор выполнения?
Да. Вы прошли учебник по Swing, посвященный индикаторам выполнения? Он покажет, как использовать их с примером кода.
Это программирование на Java Swing 101. Когда вы выполняете задачи, которые занимают много времени, вы ДОЛЖНЫ выполнять эти задачи в другом потоке. В противном случае ваш поток пользовательского интерфейса приостановит и не будет отправлять какие-либо события, пока задача не будет выполнена. Взгляни на SwingWorker
, Вот как вы можете создавать потоки и обновлять пользовательский интерфейс, когда что-то меняется.