所以,我想出了 SwingWorker 的事情。
然而,另一个问题出现了(去图)......
Swing worker 实际管理错误报告和电子邮件发送,而电子邮件是一项冗长(超过 0.5 秒)的任务,它派上用场......
为了防止我的程序在处理错误之前继续执行,我必须暂停 EDT 线程(使用同步的东西)。但是,这也会暂停未确定的 JProgressBar 具有的很酷的小动画,并且在发送消息时正在使用它,因此,当 EDT 暂停时。
我的问题是,有没有办法阻止我的程序继续执行,同时在 JProgressBar 上显示动画?
这是一些伪代码:
发生主类错误 - 用同步暂停线程并执行(创建)另一个执行 SwingWorker 的类(另一个类是必要的,确实如此,如果不是,我不会有这么多麻烦)。
new ErrorDialog(Main.modal, lang.getString("errorConfigMissingTitle"), lang.getString("errorConfigMissingMessage"), e, false);
它调用这个:
//bunch of code, this below is an action listener of one of the buttons
String s = "";
(new ErrorSender(parent, error, s, dialog)).execute();
synchronized (s)
{
try
{
s.wait();
}
catch (InterruptedException e1)
{
e1.printStackTrace();
}
}
dialog.dispose();
//create JDialog that tell user message was sent
SwingWorker 类创建sendingErrorReport JDialog(带有JProgressBar)并在后台发送消息,当消息发送时,删除暂停(notyfyAll())。
public class ErrorSender extends SwingWorker<Boolean, Void>
{
Exception e;
String s;
public ErrorSender(JFrame parent, Exception error, String k, JDialog sendingDialog)
{
e = error;
s = k;
sendingDialog = new JDialog(parent, "Sending...", false);
JProgressBar progress = new JProgressBar();
progress.setString("Sending report...");
progress.setStringPainted(true);
progress.setIndeterminate(true);
sendingDialog.getContentPane().add(progress);
sendingDialog.pack();
sendingDialog.setLocationRelativeTo(null);
sendingDialog.getContentPane().validate();
sendingDialog.setResizable(false);
sendingDialog.setVisible(true);
}
@Override
protected Boolean doInBackground() throws Exception
{
//send email here
synchronized (s)
{
s.notifyAll();
}
return null;
}
}
我没有从 done() 方法中删除暂停,因为如果没有删除暂停,则永远不会到达/调用 done()...