0

我有这个发送电子邮件的程序。我想知道我是否可以用它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 个语句需要一些时间才能执行。在这之间,我希望用户知道他的操作正在被处理

我怎样才能做到这一点 ?

4

2 回答 2

2

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

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

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

于 2011-07-25T16:31:18.223 回答
0

我很欣赏@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() );
     }
}
于 2011-07-25T18:00:00.433 回答