2012-02-23 133 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); 

}