1

好的,这是我的问题:

我正在尝试为我的一个项目构建一个自定义下载帮助程序。我希望我的实现允许多次下载(同时运行),所以我认为我应该为每次下载启动一个线程。

但是,问题是我还想更新程序的 GUI。为此,我想使用 invokeLater() 方法,因为 Swing 不是线程安全的。

现在:如果我在每个线程中使用 invokeLater() 方法来更新进度条,线程如何知道我的 GUI?请让我知道您对这种方法的看法以及您将如何解决此问题。

请同时考虑这一点:

public class frame extends JFrame {
    public frame() {
        //the constructor sets up the JProgressBar and creates a thread object
    }

    public void getFiles() {
        // Here I would start the thread.
        thread.start();
    }
}

这是另一个设置线程的类:

public class theThread extends Thread {
    // Here I would create the thread with its constructor 

    public void run() {
        // Here comes some code for the file download process
        //
        // While the thread is running the method below gets called.
        updateGUI();
    }

    public void updateGUI() {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                // Here I need to place the code to update the GUI
                // However, this method has no idea of what the GUI looks like
                // since the GUI was setup in the class 'frame'.
            }
        });
    } 
}    
4

1 回答 1

1

您可以有一个将框架作为参数的构造函数:

public class TheThread extends Thread {
    private final JFrame frame;

    public TheThread(Runnable r, JFrame frame) {
        super(r);
        this.frame = frame;
    }
}

现在您可以frame.doSomething(); 从您的updateGUI方法中调用。

请注意,实施通常Runnable比扩展更好Thread

或者,您可以使用SwingWorkers,它旨在处理您所描述的情况(更新 UI 的后台线程)。

于 2013-01-28T16:39:39.993 回答