2016-03-11 51 views
2

我正在通过Herbert Schidlt的“The Complete Reference”学习java。 在这本书中,我们建议如果你的任何一部分GUI需要做一件可能需要更长时间的事件,那么我们应该把它作为一个新的Thread来实现。如何在JButton上运行线程?

所以,我做了一个GUI来发送邮件到我的收件箱,它工作正常,但它需要2-3秒发送邮件,因此发送按钮也需要一些时间来恢复到正常状态(它保持按下直到监听者回应,如在监听器中,我已经实现了发送邮件的代码)。

为了避免这种情况,我试图在这个“发送”按钮上运行一个线程,这样当按下按钮时,将生成一个mouseEvent,该mouseEvent上的&,我想运行该线程,以便监听器立即回应,邮件通过线程发送。

我该如何实施此方案?我尝试在MouseEvent中实现新的Runnable作为内部类,但是我不知道如何调用启动方法!

代码很大,所以我只在这里放置它的“发送按钮”代码。

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

线程t =新主题(可运行); t.start(); – rkosegi

+0

@rkosegi我在哪里写这句话? –

回答

1

内部mouseCliked函数add:

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

这个例子有效,但它是一个不好的做法的例子,即:每次你想要执行一个任务时创建一个'new Thread'。最好使用_thread pool_(例如,通过'ExecutorService'或通过使用'SwingWorker'),因为创建和销毁Thread对象代价很高。在这种情况下,不会造成任何危害,因为系统可以比用户点击按钮更快地创建和销毁线程,但即使如此,为短期任务“调用”新线程“也是一种坏习惯。 –