1
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();
        }
    }

In my other class I have a event listener

public void download_buttonActionPerformed(ActionEvent e) {
        download_button.setEnabled(false);
        label_status.setText("- Downloading...");
        download.Download();
    }

When I click the button on my GUI it freezes up and the label & button never change until the file is downloaded:

http://img200.imageshack.us/img200/2435/45019860.png

Do I have to start the download on a new thread or something? If I start it on a new thread is it still possible to use the progress bar? I'm still new to java so I apologize if I'm doing this completely wrong.

4

3 に答える 3

7

Yes you need to do the download on a separate thread. In fact that will allow you to use a progress bar.

Use a SwingWorker to run the long running task. This tutorial will help with the progress bar: http://download.oracle.com/javase/tutorial/uiswing/components/progress.html

于 2011-01-15T04:06:50.233 に答える
2

This is Java Swing programming 101. When you do tasks that take a long time, you MUST do these tasks in a different thread. Otherwise, your UI thread will pause and not dispatch any events until the task is done. Take a look at SwingWorker. This is how you can create threads and update UI when something changes.

于 2011-01-15T04:06:06.897 に答える
2

Do I have to start the download on a new thread or something?

Yes. A SwingWorker would be perfect for this.

If I start it on a new thread is it still possible to use the progress bar?

Yes. Have you gone through the Swing tutorial covering progress bars? It will show how to use these with sample code.

于 2011-01-15T04:06:15.760 に答える