2011-07-25 8 views
0

私はこのプログラムを電子メールで送信しています。私はprogress barを使用してユーザーインターフェイスを改善することができますか?私が望むのは、ステートメントtransport.send()に遭遇した後にプログレスバーがそれに応じて進まなければならないということです。進歩を知る方法があります。 知られていることは、ユーザーがsendを押すと、電子メールを送信する新しいスレッドが開始されるということです。送信をクリックした後の応答は、ユーザーが自分の操作が聴かれているかどうかわからないために貧弱です。 (聞いていますが)半分の時間が経過すると、彼はJOptionPaneになります。メッセージが送信されました。あなたは誰でも彼の行動が処理されているかどうかを知りたいと思っていることに同感できます。JavaメールでJProgressBarを使用する(transport.send()の後の進捗状況を知る)

プログレスバーを使用する方法はありますか。 )私のメールプログラムの進捗状況を知るにはどうすればいいですか 私は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); 
      } 

私は、ユーザーが自分の行動が、私はそれをどのように行うことができます

を処理されていることを知ってほしいとの間で、それはexecute.Inに次の2文のためのいくつかの時間がかかりますか?

答えて

2

あなたが正しく質問していることを理解していれば、電子メール送信のプロセスについて最新情報を入手したいと考えています。この場合、この情報をプログレスバーの形式でユーザーに表示することができます。

私が知る限り、ここでは「明確な」解決策はありません。 javax.mail.Transportは方法addTransportListener(TransportListener l)を持っていますが、インターフェイスTransportListenerは、すでに完了した作業の割合を報告しません。率直に言って、私はそれが可能であるかどうかはわかりません。あなたができることは、プロセスの開始と終了時にコールバックを得ることです。電子メールを送信し、タイマータスクを使用して進捗状況を "模倣"しようとするのにかかる時間を「長くする」ロジックをプログラムに追加することができます。たとえば、通常30秒かかる場合は、1秒ごとにプログレスバーに3%を追加します。電子メールの送信が完了しない限り停止します。送信が速く完了したら、すぐに100%に飛びます。あなたはプログラムを傾けて更新することができます。ネットワークが速くなると30秒ではなく20秒と見積もられます。

もっと良い解決策があるとは思いません。そして、心配しないでください:世界のほとんどのプロセスバーは、ある種の見積もりやヒューリスティックなどに基づいています。

+0

私はあなたの答えに基づいて回答を掲載しています –

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()); 
    } 
}