【问题标题】:Using JProgressBar with Java Mail ( knowing the progress after transport.send() )将 JProgressBar 与 Java Mail 一起使用(了解 transport.send() 之后的进度)
【发布时间】:2011-07-25 16:00:38
【问题描述】:

我有这个发送电子邮件的程序。我想知道是否可以使用progress bar 来改善用户界面。我想要的是在遇到transport.send() 语句后进度条应该相应地进行。有没有办法让我知道进度。 所发生的事情是,当用户按下send 时,会启动一个发送电子邮件的新线程。单击发送后的响应很差,因为用户不知道他的操作是否正在被监听。(尽管它正在收听!) 半分钟后,他收到JOptionPane,表示是的,消息已发送。您将同意每个人都渴望知道他的操作是否正在处理。

有什么办法可以让我使用进度条。即我如何知道我的电子邮件程序的进度 如果我不能使用JProgressBar,我可以用什么方法告诉用户他的命令正在处理中,他不用担心。

顺便说一句,这是负责发送电子邮件的部分。

try {
           message.setFrom( new InternetAddress(from));
           message.setRecipients(MimeMessage.RecipientType.TO , InternetAddress.parse(to) );
           message.setSubject(subject);
           message.setText(emailMessage);
           attachment.setDataHandler( new DataHandler( fds ) );
           attachment.setFileName( fileName );
           messagePart.setText( emailMessage );
           Multipart gmailMP = new MimeMultipart();
           gmailMP.addBodyPart(attachment);
           gmailMP.addBodyPart( messagePart );
           message.setContent( gmailMP );
           Transport transport = session.getTransport("smtp");
           transport.send(message); // LINE THAT SENDS EMAIL
           transport.close();   

           JOptionPane.showMessageDialog(new JFrame() , "Message sent!");
       }    catch(Exception exc) {
               JOptionPane.showMessageDialog( new JFrame() , exc );
            }

在注释行之后,接下来的 2 个语句需要一些时间才能执行。在这之间,我希望用户知道他的操作正在处理中

我该怎么做?

【问题讨论】:

    标签: java swing jakarta-mail jprogressbar


    【解决方案1】:

    如果我正确理解您的问题,您希望了解有关电子邮件发送过程的最新信息。在这种情况下,您可以以进度条的形式向用户显示此信息。

    据我所知,您在这里没有“明确”的解决方案。虽然javax.mail.Transport 有方法addTransportListener(TransportListener l) 接口TransportListener 没有报告已经完成的工作百分比。坦率地说,我不确定这是否可能。您可以做的是在流程开始和结束时进行回调。您可以向您的程序添加一个逻辑,以“了解”发送电子邮件通常需要多长时间,然后尝试使用计时器任务“模仿”进度。例如,如果通常需要 30 秒,则每 1 秒向进度条添加 3%。然后停止,除非电子邮件发送完成。如果发送完成更快,立即跳转到 100%。您的程序可以自我更新和更新,如果网络变得更快,它将估计时间为 20 秒而不是 30 秒等。

    我认为不存在更好的解决方案。别担心:世界上大多数流程条都是基于某种估计、启发式等。

    【讨论】:

    • 我已根据您的回答发布了答案
    【解决方案2】:

    我很欣赏@AlexR 的方法。

    这就是我实现它的方式。就用户对知道按钮响应的满意度而言,它接近完美。(但有时当连接速度太慢时可能会导致问题)

    boolean status = false;  // global variable
    // add the following statement just before the statement transport.send()
    startProgressThread(); // start a separate thread for progress bar
    transport.send();  // progress bar started just before this statement is encountered
    // the execution of the following statement will take some time,by the time JProgressBar is working
    status = false; // as this statement is encountered while loop starts and jprogress bar stops.
    
    public void startProgressThread() {
        // start the thread and from here call the function showProgress()
    }
    
    public showProgress() {
         status = true;
         int i = 0;
            while( status ) {
               i++;
               jProgressBar.setValue(i);
                  try {
                    Thread.sleep(90);
                  }  catch(Exception exc) {
                         System.out.println(exc);
                     }
            }
         if( status != true ) {
             jprogressBar.setValue( jProgressBar.getMaximum() );
         }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-02
      • 2017-01-25
      • 1970-01-01
      • 2015-10-24
      相关资源
      最近更新 更多