【问题标题】:java GUI frozen when downloading file下载文件时java GUI冻结
【发布时间】:2011-01-15 04:03:13
【问题描述】:
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 上的按钮时,它会冻结,并且标签和按钮在文件下载之前永远不会改变:

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

我必须在新线程上开始下载吗?如果我在新线程上启动它,是否仍然可以使用进度条?我还是 java 新手,所以如果我做错了,我深表歉意。

【问题讨论】:

    标签: java multithreading swing user-interface swingworker


    【解决方案1】:

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

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

    【讨论】:

    • 感谢链接真的很有帮助。感谢您的帮助。
    【解决方案2】:

    这是 Java Swing 编程 101。当您执行需要很长时间的任务时,您必须在不同的线程中执行这些任务。否则,您的 UI 线程将暂停并且在任务完成之前不会分派任何事件。看看SwingWorker。这就是您可以在发生变化时创建线程和更新 UI 的方式。

    【讨论】:

      【解决方案3】:

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

      是的。 SwingWorker 将是完美的选择。

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

      是的。您是否阅读过涵盖进度条的 Swing 教程?它将通过示例代码展示如何使用这些。

      【讨论】:

        猜你喜欢
        • 2022-01-05
        • 2015-05-09
        • 1970-01-01
        • 2012-06-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多