2012-02-23 4 views
1

Почему при выполнении моей программы, когда я нажимаю Enter, мое приложение зависает?Графический пользовательский интерфейс Java Freezing

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

+0

Вам понадобится отдельный поток для прослушивания сокетов. – nullpotent

+0

http://docs.oracle.com/javase/tutorial/uiswing/concurrency/ – John

ответ

11

Когда вы нажмете ввести следующее выполняется:

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

String fromUser = clientArea.getText(); 

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

serverArea.setText(fromUser); 

Этот фрагмент кода выполняется на Event Dispatch Thread, который обрабатывает все Свинг события. Ваши звонки на in.readLine() будут блокироваться до тех пор, пока из вашего Socket не будет введена строка ввода, в результате чего необработанные события будут резервными и, таким образом, ваша программа перестанет отвечать на запросы. Если вы хотите выполнить дорогостоящую задачу, взгляните на SwingWorker (SwingWorker tutorial).

Сторона примечания: Ловля Exception без печати трассировки стека почти всегда плохая идея. Это может сделать проблемы с вашим кодом сложнее, если не невозможно, поймать.

+0

Желаю, чтобы я мог дать вам более одного голоса. –

+0

Какое предложение/исправление вы можете дать мне, чтобы исправить это? – user962206

+0

@ user962206 Взгляните на 'SwingWorker' и его учебник в моем посте. – Jeffrey

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); 

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