Использование JProgressBar с Java Mail (знание хода выполнения после transport.send ()) - PullRequest
0 голосов
/ 25 июля 2011

У меня есть эта программа, которая отправляет электронную почту. Мне было интересно, могу ли я использовать 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 операторов требуется некоторое время. Между тем я хочу, чтобы пользователь знал, что его действие обрабатывается

Как я могу это сделать?

Ответы [ 2 ]

2 голосов
/ 25 июля 2011

Если я правильно понимаю ваш вопрос, вы хотите получать информацию о процессе отправки электронной почты. В этом случае вы можете показать эту информацию пользователю в виде индикатора выполнения.

Насколько я знаю, у вас нет "ясного" решения здесь. Хотя javax.mail.Transport имеет метод addTransportListener(TransportListener l), интерфейс TransportListener не сообщает, какой процент работы уже выполнен. Честно говоря, я не уверен, что это возможно. Что вы можете сделать, это перезвонить, когда процесс запущен и завершен. Вы можете добавить в свою программу логику, которая «полагается» на то, сколько времени обычно занимает отправка электронной почты, а затем пытается «имитировать» прогресс с помощью задачи таймера. Например, если обычно это занимает 30 секунд, добавляйте 3% к индикатору прогресса каждую 1 секунду. Затем остановитесь, если отправка электронной почты не завершена. Если отправка завершена быстрее, сразу переходите на 100%. Ваша программа может наклоняться и обновляться сама, если сеть станет быстрее, она оценит время как 20 секунд вместо 30 и т. Д.

Я не думаю, что существует лучшее решение. И не беспокойтесь: большинство технологических баров в мире основаны на каких-то оценках, эвристике и т. Д.

0 голосов
/ 25 июля 2011

Я ценю метод @ 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() );
     }
}
...