Использование JProgressBar с Java Mail (знание хода выполнения после transport.send())

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

После закомментированной строки требуется некоторое время для выполнения следующих двух операторов. Между ними я хочу, чтобы пользователь знал, что его действие обрабатывается

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


person Suhail Gupta    schedule 25.07.2011    source источник


Ответы (2)


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

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

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

person AlexR    schedule 25.07.2011
comment
Я разместил ответ на основе вашего ответа - person Suhail Gupta; 25.07.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() );
     }
}
person Suhail Gupta    schedule 25.07.2011