我有一个程序,我正在加载文件,同时我正在显示一个窗口以通知用户正在加载文件。我决定创建一个 FileLoader 类,它是一个 SwingWorker,它实际处理加载文件,以及一个实现 PropertyChangeListener 的 ProgressWindow,以通知用户传递给它的 SwingWorker 的状态。
我的代码目前如下所示:
FileLoader loader = new FileLoader(filePath);
new ProgressWindow(loader, "Loading File", "Loading File");
//ProgressWindow's constructor calls loader.execute() inherited from SwingWorker
doc = loader.get(); //GUI Freezes when called
问题是每当我调用 loader.get() 时,它都会冻结 GUI,因此进度窗口中的进度条不会运行,整个事情毫无意义。据我所知,这是因为控制 GUI 的线程与调用 loader.get() 的线程相同,它在 loader.execute() 运行时暂停。
到目前为止,我已经尝试为 loader.get() 命令或 loader.execute() 方法创建一个新线程,并在线程上调用 SwingUtilities.invokeLater(),但随后整个程序冻结。
我考虑过在 SwingWorker.isDone() 时创建一个 ChangeListener,然后运行 loader.get(),但这需要对我的代码进行一些我不想做的修改。
谁能告诉我最好的方法是让它工作吗?