当前位置: 首页 > 知识库问答 >
问题:

SwingWorker,再次,但新的

况喜
2023-03-14

所以,我想通了摇摆工人的事情。

然而,另一个问题出现了(去图)...

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()……

共有2个答案

程毅
2023-03-14

请看看并测试一下。

>

  • 预订示例 摇摆工人和J前进酒吧

    执行者和摇摆工人

    如何获得例外

  • 罗睿识
    2023-03-14

    在后台线程运行时暂停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与互联网连接而无法下载。