好的,这是我的问题:
我正在尝试为我的一个项目构建自定义下载帮助程序。我希望我的实现允许多次下载(同时运行),所以我想我应该为每次下载启动一个线程。
然而,问题是我还想更新程序的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'.
}
});
}
}
答案 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的后台线程)。