私はリスク管理システムを開発しており、その機能の一部として、対応する是正措置が割り当てられているすべてのメンバーに電子メールを送信しています。そのため、電子メールの送信中にユーザーを最新の状態に保つための手段として、電子メールの送信プロセス中に GUI がフリーズするため、進行状況モニターとスイング ワーカーを使用することにしました。これを達成する方法はよくわかりませんが、私が知っていることは、メール送信を処理するタスク、メール送信プロセスを監視するためのプロパティ変更リスター、およびメール送信を開始するための actiondlister を作成する必要があるということです。以下は私が書いたクラスとメソッドですが、設定した目標を達成するためにそれらをまとめる方法がわかりません。
private void jButton4ActionPerformed(java.awt.event.ActionEvent evt) {
setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
progressMonitor = new ProgressMonitor(NewJFrame.this, "Sending an email", " ", 0, 100);
progressMonitor.setProgress(0);
task = new Task();
task.addPropertyChangeListener(this);
task.execute();
}
@Override
public void propertyChange(PropertyChangeEvent evt) {
if("progress".equals(evt.getPropertyName())){
int progress = (Integer) evt.getNewValue();
progressMonitor.setProgress(progress);
String message = String.format("Sending message ..%d%%...\n", progress );
jTextArea1.append(message);
//progressMonitor.setNote(task.getMessage());
if(progressMonitor.isCanceled() || task.isDone()){
progressMonitor.close();
Toolkit.getDefaultToolkit().beep();
if(progressMonitor.isCanceled()){
task.cancel(true);
}else{
jTextArea1.append("Message Send");
}
}
}
}
class Task extends SwingWorker<Void, Void>{
@Override
protected Void doInBackground() throws Exception {
int progress = 0;
setProgress(0);
try{
Thread.sleep(1000);
progress += 5;
progress++;
setProgress(progress);
Properties props = new Properties();
props.put("mail.smtp.host", "mail.test.biz");
props.put("mail.smtp.port", "587");
props.put("mail.smtp.starttls.enable", "true");
props.put("mail.smtp.auth", "true");
Session session = Session.getDefaultInstance(props,
new javax.mail.Authenticator() {
protected PasswordAuthentication getPasswordAuthentication(){
return new PasswordAuthentication("herbert@conceptium.biz", "Kaylad1*#");
}
});
try {
Message msg = new MimeMessage(session);
msg.setFrom(new InternetAddress("herbert@conceptium.biz"));
msg.addRecipients(Message.RecipientType.CC, InternetAddress.parse("herbertd@test.com,herbert@test.biz"));
msg.setSubject("This is a test");
msg.setText("This is a test a message");
Transport.send(msg);
JOptionPane.showMessageDialog(NewJFrame.this, "Email succesfull sent...!" );
}
catch(MessagingException | HeadlessException e){
//progressMonitor.isCanceled();
JOptionPane.showMessageDialog(NewJFrame.this, e.getMessage() +". "+ "Please check your internet connection");
}
}catch(InterruptedException | HeadlessException e){
JOptionPane.showMessageDialog(NewJFrame.this, e.getMessage());
}
return null;
}
@Override
public void done(){
setCursor(null);
//jTextArea1.append("Done!\n");
progressMonitor.setProgress(100);
}
}
私は電子メールアドレスをハードコーディングしましたが、ベースからドーム型になると思います. 簡単にするために、そのメソッドを削除し、要点を伝えるのに十分なコードのみを配置しました。いくつかの助けをいただければ幸いです。