gpt4 book ai didi

java - SwingWorker 的问题

转载 作者:太空宇宙 更新时间:2023-11-04 07:14:02 25 4
gpt4 key购买 nike

这段代码确实有效,但我认为可以用不同的方式编写。我有一个自定义 JDialog,用于显示不确定的进度条。我在 while 循环中设置了标题、可见性和位置。虽然这有效,但我认为它应该显示在我创建工作人员的位置的正下方,但是当我这样做时,它会给我一个非法的开始类型错误。有任何想法吗?谢谢。

SwingWorker worker = new SwingWorker<Void, Void>(){
//I am thinking this should work, but it doesn't
// Progress.setTitle("Loading Repository");
// Progress.setLocationRelativeTo(null);
// Progress.setVisible(true);
@Override
protected Void doInBackground() throws Exception {
while (runLoad.getState() != Thread.State.TERMINATED && !isCancelled()) {
try {
Progress.setTitle("Loading Repository");
Progress.setLocationRelativeTo(null);
Progress.setVisible(true);
synchronized (this) {
Thread.sleep(2000);
}
} catch (InterruptedException e) {
JOptionPane.showMessageDialog(null,
"Process interrupted: " + e.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);
}
}
return null;
}
@Override
public void done() {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
Progress.setVisible(false);
Progress.dispose();
}
});
}
};
worker.execute();

最佳答案

您不能将此类语句直接放入类中。它们必须位于方法内部。这就是为什么如果取消注释这些语句则代码无法编译的原因。

这些语句根本不应该位于工作线程内部。它们应该位于封闭方法中,就在执行工作线程之前。事实上,您希望在后台进程启动之前初始化进度对话框并使其仅可见一次。而且您不能在 doInBackground() 中执行此操作,因为对 Swing 组件的每次访问都必须在事件调度线程中完成,而不是在后台线程中完成。

JOptionPane.showMessageDialog() 的调用也是如此:它不应该位于 doInBackground() 方法内,因为它必须在事件分派(dispatch)线程中完成。它应该位于 done() 方法内,该方法应该调用 get() 来查看后台进程是否成功。

done() 中的代码不需要包含在 SwingUtilities.invokeLater() 中,因为 done() 是在事件调度线程中执行的。

最后,您应该遵守 Java 命名约定:变量以小写字母开头。

关于java - SwingWorker 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20246580/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com