2016-03-11 2 views
2

Я изучаю java из «The Complete Reference» Герберта Шилдта. В этой книге сообщается, что если какая-либо часть вашего GUI должна делать то, что может потребовать больше времени для генерации события, тогда мы должны реализовать эту вещь как новый поток.Как запустить поток на JButton?

Итак, я создал графический интерфейс для отправки писем в мой почтовый ящик, который работает нормально, но для отправки почты требуется 2-3 секунды, и, следовательно, кнопка отправки также требует времени, чтобы вернуться в нормальное состояние (она остается нажатой пока слушатель не ответит назад, так как In Listener, я внедрил код для отправки почты).

Чтобы избежать этого, я пытаюсь запустить поток на этой кнопке «Отправить», чтобы при нажатии кнопки mouseEvent будет создан & на этом mouseEvent, я хочу запустить поток, чтобы Слушатель отвечает сразу же, а почта отправляется через поток.

Как реализовать эту схему? Я попытался внедрить новый Runnable в качестве внутреннего класса в MouseEvent, но я не могу понять, как я могу вызвать метод start!

код большой, поэтому я поставлю здесь только код «Отправить кнопку».

sendButton.addMouseListener(new MouseAdapter(){ 
    public void mouseClicked(MouseEvent me){ 

    String id=emailIdField.getText(); 
    String subject=subjectField.getText(); 
    String body=mailBodyArea.getText();     
    String user= "[email protected]"; 
    String pass="password"; 
    String host="smtp.gmail.com"; 
    sendEmail= new SendEmail(); // class which actually sends the mail. defined in other file. 
    sendEmail.sendMail(id, user, subject ,body ,host, user, pass); 
} 
}); 

Я хочу запустить код внутри этой функции MouseClicked в качестве новой темы. То, что я пытался до сих пор есть,

sendButton.addMouseListener(new MouseAdapter(){ 
    public void mouseClicked(MouseEvent me){ 

    new Runnable(){ 

       public void run(){ 
        String id=emailIdField.getText(); 
      String subject=subjectField.getText(); 
      String body=mailBodyArea.getText(); 
      System.out.println(id); 
      System.out.println(subject); 
      System.out.println(body); 
      String user= "[email protected]"; 
      String pass="impe(*&amit"; 
      String host="smtp.gmail.com"; 
      sendEmail= new SendEmail(); 
      sendEmail.sendMail(id, user, subject ,body ,host, user, pass); 


       } 
      }; 
}); 

Но теперь я не знаю, как, как я называю метод запуска к этой теме? Пожалуйста, порекомендуйте.

+0

т Thread = новая тема (работоспособный); t.start(); – rkosegi

+0

@rkosegi где именно я пишу это заявление? –

ответ

1

Внутри mouseCliked функция дополнит:

new Thread() { 
public void run() { 
    String id=emailIdField.getText(); 
    String subject=subjectField.getText(); 
    String body=mailBodyArea.getText(); 
    System.out.println(id); 
    System.out.println(subject); 
    System.out.println(body); 
    String user= "[email protected]"; 
    String pass="impe(*&amit"; 
    String host="smtp.gmail.com"; 
    sendEmail= new SendEmail(); 
    sendEmail.sendMail(id, user, subject ,body ,host, user, pass); 
} 
}.start(); 
+0

большое спасибо. это сработало ! :) –

+0

Этот пример работает, но это пример плохой практики, а именно: создание «новой темы» каждый раз, когда вы хотите выполнить одну задачу. Лучше использовать пул _thread_ (например, через «ExecutorService» или с помощью «SwingWorker»), потому что создание и уничтожение объектов «Thread» дорого. В этом случае никакого вреда не делается, потому что система может создавать и уничтожать потоки быстрее, чем пользователь может щелкнуть кнопку, но даже в этом случае плохой привычкой «круглый вызов» новой темы для краткосрочных задач. –

Смежные вопросы