Java GUI зависает при загрузке файла

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, поэтому прошу прощения, если делаю это совершенно неправильно.


person Kyle    schedule 15.01.2011    source источник


Ответы (3)


Да, вам нужно сделать загрузку в отдельном потоке. На самом деле это позволит вам использовать индикатор выполнения.

Используйте SwingWorker для запуска длительной задачи. Этот учебник поможет с индикатором выполнения: http://download.oracle.com/javase/tutorial/uiswing/components/progress.html

person jzd    schedule 15.01.2011
comment
Спасибо за ссылку, она действительно помогает. Я ценю помощь. - person Kyle; 15.01.2011

Это программирование Java Swing 101. Когда вы выполняете задачи, которые занимают много времени, вы ДОЛЖНЫ выполнять эти задачи в другом потоке. В противном случае ваш поток пользовательского интерфейса приостановится и не отправит никаких событий, пока задача не будет выполнена. Взгляните на SwingWorker. Вот как вы можете создавать потоки и обновлять пользовательский интерфейс, когда что-то меняется.

person Amir Raminfar    schedule 15.01.2011

Должен ли я начать загрузку в новом потоке или что-то в этом роде?

Да. SwingWorker идеально подходит для этого.

Если я начну его в новом потоке, можно ли использовать индикатор выполнения?

Да. Вы ознакомились с учебным пособием по Swing, охватывающим индикаторы выполнения? Он покажет, как использовать их с примером кода.

person Hovercraft Full Of Eels    schedule 15.01.2011