0

私は電子メールを送信するこのプログラムを持っていprogress barます。ユーザー インターフェイスを改善するために使用できないかと考えていました。私が望むのは、ステートメントtransport.send()が発生した後、進行状況バーがそれに応じて進行することです.進行状況を知る方法はありますか. ユーザーが押すsendと、電子メールを送信する新しいスレッドが開始されます。送信をクリックした後の応答は、ユーザーが自分のアクションがリッスンされているかどうかを知らないため、貧弱です。(それは聞かれていますが!) 30 分ほどのギャップの後、彼は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%にジャンプします。あなたのプログラムは身を乗り出して自分自身を更新することができます。ネットワークが速くなると、30秒ではなく20秒と推定されます。

より良い解決策は存在しないと思います。そして心配しないでください。世界のほとんどのプロセスバーは、ある種の推定、ヒューリスティックなどに基づいています。

于 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 に答える