如何从Java中的线程调用invokeLater方法?

时间:2013-01-28 16:35:23

标签: java multithreading swing inheritance composition

好的,这是我的问题:

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

然而,问题是我还想更新程序的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'.
            }
        });
    } 
}    

1 个答案:

答案 0 :(得分: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的后台线程)。