下载文件时冻结java GUI

时间:2011-01-15 04:03:14

标签: java multithreading swing user-interface swingworker

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

当我点击我的GUI上的按钮时,它冻结了标签&amp;在下载文件之前,按钮永远不会改变:

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

我是否必须在新线程上开始下载?如果我在一个新线程上启动它仍然可以使用进度条?我还是java的新手,所以如果我完全错了,我会道歉。

3 个答案:

答案 0 :(得分:7)

是的,您需要在单独的线程上进行下载。实际上,这将允许您使用进度条。

使用SwingWorker运行长时间运行的任务。本教程将对进度条提供帮助:http://download.oracle.com/javase/tutorial/uiswing/components/progress.html

答案 1 :(得分:2)

这是Java Swing编程101.当您执行需要很长时间的任务时,您必须在不同的线程中执行这些任务。否则,您的UI线程将暂停,并且在任务完成之前不会调度任何事件。看看SwingWorker。这是您在更改内容时创建线程和更新UI的方法。

答案 2 :(得分:2)

  

我是否必须在新线程上开始下载?

是。 SwingWorker对此非常适合。

  

如果我在一个新线程上启动它仍然可以使用进度条吗?

是。你是否经历过涉及进度条的Swing教程?它将展示如何将这些与示例代码一起使用。