Java 又是SwingWorker,但还是新的
所以,我想出了SwingWorker的事 然而,另一个问题出现了(如图所示) Swing worker通常管理错误报告和电子邮件发送,而电子邮件发送是一项耗时(超过0.5秒)的任务,它非常方便 为了防止我的程序在错误处理之前继续执行,我必须暂停EDT线程(使用同步的东西)。但是,这也将暂停未确定的JProgressBar所具有的、在发送消息时正在使用的、很酷的小动画,因此,当EDT暂停时 我的问题是,有没有办法阻止我的程序继续执行,同时在JProgressBar上显示动画 下面是什么伪代码: 主类 错误发生-使用syncronised暂停线程,并执行(创建)另一个执行SwingWorker的类 (另一门课是必须的,真的是,如果不是的话,我就不会有这么多麻烦了) 它援引了这一点:Java 又是SwingWorker,但还是新的,java,swing,swingworker,Java,Swing,Swingworker,所以,我想出了SwingWorker的事 然而,另一个问题出现了(如图所示) Swing worker通常管理错误报告和电子邮件发送,而电子邮件发送是一项耗时(超过0.5秒)的任务,它非常方便 为了防止我的程序在错误处理之前继续执行,我必须暂停EDT线程(使用同步的东西)。但是,这也将暂停未确定的JProgressBar所具有的、在发送消息时正在使用的、很酷的小动画,因此,当EDT暂停时 我的问题是,有没有办法阻止我的程序继续执行,同时在JProgressBar上显示动画 下面是什么伪代码: 主
//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类
创建SendingErrorReportJDialog(使用JProgressBar)
并在后台发送消息,当消息发送时,删除暂停(notyyall())
公共类ErrorSender扩展SwingWorker
{
例外情况e;
字符串s;
公共ErrorSender(JFrame父项、异常错误、字符串k、JDialog sendingDialog)
{
e=误差;
s=k;
sendingDialog=新建JDialog(父级,“正在发送…”,false);
JProgressBar进度=新建JProgressBar();
progress.setString(“发送报告…”);
进度。设置字符串绘制(真);
progress.setUndeterminate(true);
sendingDialog.getContentPane().add(进度);
sendingDialog.pack();
sendingDialog.setLocationRelativeTo(空);
sendingDialog.getContentPane().validate();
sendingDialog.SetResizeable(false);
sendingDialog.setVisible(true);
}
@凌驾
受保护的布尔值doInBackground()引发异常
{
//在这里发送电子邮件
已同步
{
s、 notifyAll();
}
返回null;
}
}
我并没有从done()方法中删除pause,因为如果不删除pause,则永远不会到达/调用done()。在后台线程运行时暂停EDT,然后恢复EDT是完全相同的,但以一种更复杂的方式,就像在EDT中执行冗长的阻塞操作一样。这毫无意义
如果要防止用户在后台任务运行时使用该程序,只需显示一个模式对话框,并在后台任务完成后将其关闭(或允许关闭)。查看并请进行测试
首先执行
SwingWorker
,然后向您的客户显示我的示例中演示的对话框。如果您解释了您试图实现的总体效果,这会有所帮助-我觉得我已经跳过了解释的一半。。。?您不需要暂停EDT来阻止应用程序在长时间运行的操作中执行操作。
//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
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;
}
}