Java 又是SwingWorker,但还是新的

Java 又是SwingWorker,但还是新的,java,swing,swingworker,Java,Swing,Swingworker,所以,我想出了SwingWorker的事 然而,另一个问题出现了(如图所示) Swing worker通常管理错误报告和电子邮件发送,而电子邮件发送是一项耗时(超过0.5秒)的任务,它非常方便 为了防止我的程序在错误处理之前继续执行,我必须暂停EDT线程(使用同步的东西)。但是,这也将暂停未确定的JProgressBar所具有的、在发送消息时正在使用的、很酷的小动画,因此,当EDT暂停时 我的问题是,有没有办法阻止我的程序继续执行,同时在JProgressBar上显示动画 下面是什么伪代码: 主

所以,我想出了SwingWorker的事

然而,另一个问题出现了(如图所示)

Swing worker通常管理错误报告和电子邮件发送,而电子邮件发送是一项耗时(超过0.5秒)的任务,它非常方便

为了防止我的程序在错误处理之前继续执行,我必须暂停EDT线程(使用同步的东西)。但是,这也将暂停未确定的JProgressBar所具有的、在发送消息时正在使用的、很酷的小动画,因此,当EDT暂停时

我的问题是,有没有办法阻止我的程序继续执行,同时在JProgressBar上显示动画

下面是什么伪代码:

主类 错误发生-使用syncronised暂停线程,并执行(创建)另一个执行SwingWorker的类 (另一门课是必须的,真的是,如果不是的话,我就不会有这么多麻烦了)

它援引了这一点:

            //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;
        }
    }