下载文件时 java GUI 卡住

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

在我的其他类(class)我有一个事件监听器

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 还是个新手,所以如果我做错了,我深表歉意。

最佳答案

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

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

关于下载文件时 java GUI 卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4697918/

相关文章:

java - 按下按钮后每 3 秒更新一次 JTextFields 文本

java - 在可拖动的 jPanel 中更改 jLabel 的文本

java - 除了性能问题,为什么仍然选择 Java 而不是 Groovy/JRuby 等?

java - 使用按钮停止 for 循环

ios - 在非主线程上设置一个大的 NSDictionary 属性

multithreading - 我可以从RxJava流内部通知BehaviorProcessor吗?

Java布局忽略属性文档

java - 在同一打印行中读取内容

Java 接口(interface)和类型

java - 如何为嵌入式 jetty/ Spring 安全启用 HTTP 摘要?