Потовое программирование пользовательского интерфейса Java?

Пытаюсь написать программу отправки сообщений на e-mail адрес с использованием swing NetBeans. В принципе все работает, проблема заключается в следующем:
Есть список адресатов в таблице, всем им нужно отправить одинаковое сообщение из jTextArea и тем кому отправлено поставить в таблице статус "Отправлено" и заполнить jProgressBar в реальном времени. Отправка происходит по нажатию на кнопку. Если написать эти действия последовательно, то интерфейс виснет до окончания цикла отправки. Пробовал этот цикл вынести в отдельный поток, результат тот же. Как быть?
Вот код:
List<String> sendMail = new ArrayList<>();
        for (int i=0;i<jTable1.getRowCount();i++){
            if ((Boolean)jTable1.getValueAt(i, 0)) sendMail.add((String)jTable1.getValueAt(i, 1));
        }
        
        String subject = jTextField1.getText();
        String msg = jTextArea2.getText();
        
        jProgressBar1.setMinimum(0);
        jProgressBar1.setMaximum(sendMail.size());
        jProgressBar1.setValue(0);
        
        Properties props = new Properties();
        props.setProperty("mail.smtp.host", "smtp.yandex.ru");
        props.setProperty("mail.smtp.port", "465");
        props.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
        props.setProperty("mail.smtp.socketFactory.port", "465");
        props.setProperty("mail.smtp.auth", "true");
        
        props.setProperty("user", "user");
        props.setProperty("pwd", "*****");
        int i =0;
        SendUtils sm = new SendUtils(props);
        for (String mail:sendMail){
           try{
                sm.send(mail, subject, msg);
                jTable1.setValueAt(new ImageIcon("ok.png"), i, 2);
           }catch(MessagingException e){
                jTable1.setValueAt(new ImageIcon("no.png"), i, 2);
            }
            jProgressBar1.setValue(++i);
        }


А вот в отдельном потоке:
new Thread(new Runnable() {
        @Override
        public void run() {
        List<String> sendMail = new ArrayList<>();
        for (int i=0;i<jTable1.getRowCount();i++){
            if ((Boolean)jTable1.getValueAt(i, 0)) sendMail.add((String)jTable1.getValueAt(i, 1));
        }
        
        String subject = jTextField1.getText();
        String msg = jTextArea2.getText();
        
        jProgressBar1.setMinimum(0);
        jProgressBar1.setMaximum(sendMail.size());
        jProgressBar1.setValue(0);
        
        Properties props = new Properties();
        props.setProperty("mail.smtp.host", "smtp.yandex.ru");
        props.setProperty("mail.smtp.port", "465");
        props.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
        props.setProperty("mail.smtp.socketFactory.port", "465");
        props.setProperty("mail.smtp.auth", "true");
        
        props.setProperty("user", "support@rodina.tv");
        props.setProperty("pwd", "iNg9quup");
        int i =0;
        SendUtils sm = new SendUtils(props);
        for (String mail:sendMail){
            try{
                sm.send(mail, subject, msg);
                jTable1.setValueAt(new ImageIcon("ok.png"), i, 2);
            }catch(MessagingException e){
                jTable1.setValueAt(new ImageIcon("no.png"), i, 2);
            }
            jProgressBar1.setValue(++i);
        }
         }
        }).run();
  • Вопрос задан
  • 2633 просмотра
Пригласить эксперта
Ответы на вопрос 2
@aobiedkov Автор вопроса
java
Все решил, вместо run вызвал start, попутал запуск потока)
Ответ написан
@madcat_samara
Для этого в swing сделан класс SwingUtilities, а конкретно - метод invokeLater. В документации рекомендуется пользоваться им.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы