-3

所以,我想出了 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()...

4

2 回答 2

4

在后台线程运行时暂停 EDT 然后恢复它是完全相同的,但是以一种更复杂的方式,就像在 EDT 中执行冗长的阻塞操作一样。这没有道理。

如果您想阻止用户在后台任务运行时使用该程序,只需显示一个模式对话框,并在后台任务完成后关闭它(或允许关闭它)。

于 2012-09-28T21:38:08.243 回答
1

看看,请测试

  1. 预订示例 SwingWorker 和 JProgressBar

  2. 执行者和 SwingWorker

  3. 如何获得异常

于 2012-09-28T21:40:36.127 回答