2012-02-23 130 views
1

爲什麼當我點擊輸入執行我的程序時,我的應用程序凍結了?Java圖形用戶界面被凍結

import javax.swing.JFrame; 
import javax.swing.JTextArea; 
import javax.swing.JTextField; 
import javax.swing.JButton; 
import java.awt.FlowLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.JOptionPane; 
import java.io.*; 
import java.net.*; 

public class KnockKnockUI{ 

     private Socket kkSocket = null; 
     private PrintWriter out = null; 
     private BufferedReader in = null; 
     JTextArea clientArea; 
     JTextArea serverArea; 
    public KnockKnockUI(){ 

     establishConnection(); 
     initComponents(); 

    } 

    public void initComponents(){ 

     JFrame frame = new JFrame("Chat"); 
     frame.setVisible(true); 
     frame.setSize(320,189); 
     frame.getContentPane().setLayout(null); 

     serverArea = new JTextArea(); 
     serverArea.setLineWrap(true); 
     serverArea.setBounds(10, 11, 284, 45); 
     frame.getContentPane().add(serverArea); 

     clientArea = new JTextArea(); 
     clientArea.setBounds(10, 67, 284, 46); 
     frame.getContentPane().add(clientArea); 

     JButton btnEnter = new JButton("Enter"); 
     btnEnter.setBounds(96, 124, 89, 23); 
     frame.getContentPane().add(btnEnter); 

     btnEnter.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent arg0) { 
       try{ 
        in.readLine(); 
       }catch(Exception e){ 

       } 
       String fromUser = clientArea.getText(); 
       try { 
        fromUser = in.readLine(); 
       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
       serverArea.setText(fromUser); 
      } 
     }); 

    } 

    public void establishConnection(){ 

     //Establishes Connection 
     try { 
      kkSocket = new Socket("localhost", 4444); 
      // 
      out = new PrintWriter(kkSocket.getOutputStream(), true); 
      in = new BufferedReader(new InputStreamReader(kkSocket.getInputStream())); 
     } catch (UnknownHostException e) { 
      System.err.println("Don't know about host: taranis."); 
      System.exit(1); 
     } catch (IOException e) { 
      System.err.println("Couldn't get I/O for the connection to: taranis."); 
      System.exit(1); 
     } 

    } 
    public static void main(String[] args){ 
     KnockKnockUI ui = new KnockKnockUI(); 
    } 
} 

這是使用一個簡單的Java聊天客戶端,還有一些我不包括其他類。像服務器類和協議類

+0

你如何調試這意味着以後?請向我們展示您獲得的例外情況。 – Max 2012-02-23 03:26:30

+0

你需要一個單獨的線程來監聽套接字。 – nullpotent 2012-02-23 03:31:38

+0

http://docs.oracle.com/javase/tutorial/uiswing/concurrency/ – John 2012-02-23 03:35:03

回答

11

當你按下回車鍵,下面的執行:正在上Event Dispatch Thread,它處理所有搖擺事件進行

try { 
    in.readLine(); 
} catch (Exception e) { 
} 

String fromUser = clientArea.getText(); 

try { 
    fromUser = in.readLine(); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

serverArea.setText(fromUser); 

這個代碼塊。您撥打in.readLine()將會阻止,直到您的Socket有一行輸入可用,導致未處理的事件備份,從而導致您的程序無響應。如果您想執行耗時的任務,請查看SwingWorkerSwingWorker tutorial)。

備註:捕獲一個Exception而不打印堆棧跟蹤幾乎總是一個壞主意。如果不是不可能的話,它可以讓你的代碼更難以捕捉。下面幀的

+0

希望我可以給你多一個票。 – 2012-02-23 03:38:16

+0

你可以給我什麼建議/修復來解決這個問題? – user962206 2012-02-23 04:40:40

+0

@ user962206在我的文章中查看'SwingWorker'及其教程。 – Jeffrey 2012-02-23 05:01:17

0

的setSize將所有組件

公共無效的initComponents(){

JFrame frame = new JFrame("Chat"); 

    frame.getContentPane().setLayout(null); 

    serverArea = new JTextArea(); 
    serverArea.setLineWrap(true); 
    serverArea.setBounds(10, 11, 284, 45); 
    frame.getContentPane().add(serverArea); 

    clientArea = new JTextArea(); 
    clientArea.setBounds(10, 67, 284, 46); 
    frame.getContentPane().add(clientArea); 

    JButton btnEnter = new JButton("Enter"); 
    btnEnter.setBounds(96, 124, 89, 23); 
    frame.getContentPane().add(btnEnter); 

    btnEnter.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent arg0) { 
      try{ 
       in.readLine(); 
      }catch(Exception e){ 

      } 
      String fromUser = clientArea.getText(); 
      try { 
       fromUser = in.readLine(); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
      serverArea.setText(fromUser); 
     } 
    }); 

    frame.setVisible(true); 
    frame.setSize(320,189); 

}