所以,我想通了摇摆工人的事情。
然而,另一个问题出现了(去图)...
Swing worker实际上管理错误报告和电子邮件发送,并且电子邮件是一个长时间(超过0 . 5秒)的任务,它很方便...
为了防止我的程序在错误处理之前继续执行,我必须暂停EDT线程(用那个同步的东西)。然而,这也会暂停不确定JProgressBar的酷小动画,以及在发送消息时正在使用的动画,所以,当EDT暂停时。
我的问题是,有没有办法阻止我的程序继续执行,同时在JProgressBar上显示动画?
以下是伪代码:
出现主类错误——用syncronised暂停线程,并执行(创建)另一个执行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 类创建发送错误报告 JDialog(使用 J 进程栏)并在后台发送消息,当消息发送时,删除暂停(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;
}
}
我不会从do()方法中删除暂停,因为如果不删除暂停,则永远不会到达/调用do()……
请看看并测试一下。
>
预订示例 摇摆工人和J前进酒吧
执行者和摇摆工人
如何获得例外
在后台线程运行时暂停EDT,然后恢复它是完全相同的,但方式更复杂,就像在EDT中执行冗长的阻塞操作一样。这没有意义。
如果您想防止用户在后台任务运行时使用程序,只需显示一个模态对话框,并在后台任务完成后关闭它(或允许关闭它)。
问题内容: 下面显示的以下代码会将3个JLabel添加到JFrame中,然后删除3个JLabel。2秒后,它将重新绘制3个JLabel。 我面临的一个小问题是,它正在重新绘制到新的frame(frameTwo)而不是旧的frame(frameOne)。 如何使它重新绘制现有框架而不是重新绘制到新框架? 问题答案: Simpy使用CardLayout来交换视图。 请使用Swing计时器,而不要使用当
问题内容: 您好,我想知道从swingworkerthread向jtextarea添加文本的最佳方法是什么,我创建了另一个类,Threadsclass()。execute()调用了jbutton。并且线程与此代码并行运行 现在id要做的是将x的值添加到主gui上的文本区域,任何想法都值得赞赏。 问题答案: JavaDocs有一个很好的例子 看一下发布和处理 潜在的意图是,您仅需要从事件调度线程中更
印度的《公司法》有一些变化。其中值得注意的是,有一项规定,如果公司进行了数字签名,则可以以电子形式维护其登记册。以下几点让我感到困惑: > 记录一旦以数字方式标注日期和签名,不得编辑或更改; 记录应能够根据法案的规定或根据法案制定的规则进行更新,更新日期应能够记录在每次更新中。 想象一下,我们正在对PDF中的表进行数字签名。如果表中最初有2行,并且用户对pdf进行数字签名。现在,我们在pdf中再添
这是qt-pyside-savegeometry()saveState()的后续问题 null 这种方法适用于所有停靠窗口的停靠位置。它也可以很好地工作在浮动位置的未对接的窗口,只要窗口是未对接的出口。 当用户在会话内根据他们的需要裁剪浮动窗口的位置时,停靠和重新浮动窗口使其成功地恢复用户的首选位置。 然而,当用户裁剪了窗口的大小和位置,然后停靠窗口,然后退出时,问题就出现了。重新启动时,窗口不会
5.8.2.再重构一次? 我们希望用户能够在不同的界面中感受到一致的体验,也希望我们自己管理代码能够更容易些——再重构一次吧。在此我们引入一个BaseActivity作为所有Activity的基类,将重用的代码提取出来。
可再次下载过去已下载的内容。 1. 轻触(选项)>[下载列表]。 显示可再次下载过去已下载的内容。若有使用PS3™等其它主机下载的内容,也会一并显示。 2. 选择想下载的内容后,轻触[下载]。 开始下载。若要确认下载的进度,请在按下PS键后,轻触画面右上角的最新资讯指示灯。 若要下载内容,需先将PS Vita专用存储卡插入PS Vita。 部分内容可能会因无法使用Wi-Fi与互联网连接而无法下载。