2014-02-20 81 views
0

我想從一個applet調用一個servlet,然後顯示servlet在applet gui中的響應,問題是當我按下按鈕調用servlet時,GUI塊直到響應到達,我嘗試把請求代碼放在一個線程中,但是它凍結了gui,這是代碼:Applet和Servlet通信塊GUI

public class SearchApplet extends JApplet implements ActionListener{ 
    JTextField JTF_address; 

public void init() { 
    JLabel JL_address = new JLabel("Address: "); 
    JL_address.setFont(new Font("OpenSans", Font.PLAIN, 16)); 
    JTF_address = new JTextField(20); 
    .... 
} 

public void actionPerformed(ActionEvent e) { 
    SearchThread search = new SearchThread(); 
    search.run(); 
} 

public class SearchThread implements Runnable { 

     public SearchThread() { 
     } 

     public void run() { 

     try { 
     String input = "prova"; 
     URLConnection con = getServletConnection(); 
     OutputStream outstream = con.getOutputStream(); 
     ObjectOutputStream oos = new ObjectOutputStream(outstream); 
     oos.writeObject(input); 
     oos.flush(); 
     oos.close(); 

     // receive result from servlet 
     InputStream instr = con.getInputStream(); 
     ObjectInputStream inputFromServlet = new ObjectInputStream(instr); 
     String result = (String) inputFromServlet.readObject(); 
     inputFromServlet.close(); 
     instr.close(); 

     // show result 
     JTF_address.setText(result); 

     } catch (Exception ex) { 
     ex.printStackTrace(); 
     System.out.println(ex.toString()); 
     } 
    } 
    } 

} 

我該怎麼辦?

+0

移動你的通訊出來的GUI線。 – keshlam

+0

我該怎麼做? – Piero

+0

我認爲,「我如何編寫多線程應用程序」太籠統,也是Stack Overflow的一個問題。在Java中有很多關於多線程編程的教程... – keshlam

回答

1

不要叫

search.run(); 

呼叫

new Thread(search).start(); 

代替。

在你的actionPerformed中,你只是調用在當前線程中運行的方法。如果你調用start()來代替它,它會發揮魔力,並啓動執行run()的新線程。

那麼你應該修改你展示的結果,因爲你不能在一個線程,是不是AwtEventQueue改變UI的方式......你可以考慮這樣的事情:

 //... 

     // show result 
     final String myResult=result; 
     SwingUtilities.invokeLater(new Runnable(){ 
     public void run(){ 
      JTF_address.setText(myResult); 
     } 
     }); 
1

在您的actionPerformed方法中,由於GUI凍結,您會阻止Event Dispatch Thread長時間運行的任務。對於後臺進程,您可以使用SwingWorkerExecutorService。這將在不凍結GUI的情況下在後臺執行任務。

也讀了約Concurrency in Swing