2012-04-21 2 views
1

netbeans에서 스윙을 사용하여 간단한 클라이언트 서버 통신을 수행하려고합니다. 실행할 때 처음에는 빈 창이 표시됩니다. 다시 첫 번째 출력 창을 닫지 않고 실행하면 원하는 출력이 표시됩니다. 나는 코드를 붙이고있다.스윙 출력이 처음 실행시 켜지지 않음

감사

import java.io.*; 
import java.net.*; 

public class serverg extends javax.swing.JFrame { 

ServerSocket ss; 
Socket s; 
BufferedReader in; 
PrintWriter out; 

public serverg() { 
    initComponents();  
} 

void work() { 
    try { 

     String line; 
     ss = new ServerSocket(3500); 
     s=new Socket(); 
     jTextArea1.append("waiting for connection"); 
     s=ss.accept(); 
     in = new BufferedReader(new InputStreamReader(s.getInputStream())); 
     out = new PrintWriter(s.getOutputStream()); 
     out.print("connection established"); 
     if((line=in.readLine())!=null) 
     jTextArea1.append("Client : " + line); 

    } catch (IOException r) { 
    } 

} 

@SuppressWarnings("unchecked") 
// <editor-fold defaultstate="collapsed" desc="Generated Code">       
private void initComponents() { 

    jScrollPane1 = new javax.swing.JScrollPane(); 
    jTextArea1 = new javax.swing.JTextArea(); 
    jTextField1 = new javax.swing.JTextField(); 
    jButton1 = new javax.swing.JButton(); 
    jLabel1 = new javax.swing.JLabel(); 

    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); 
    setName("Form"); // NOI18N 

    jScrollPane1.setName("jScrollPane1"); // NOI18N 

    /*try{ 
     jTextArea1.setEditable(false); 
     //s=new Socket(); 
     jTextArea1.append("waiting for client..."); 
     s=ss.accept(); 
     String line=in.readLine(); 
     jTextArea1.append("Client : " + line); 
    } 
    catch(IOException r){}*/ 
    jTextArea1.setColumns(20); 
    jTextArea1.setRows(5); 
    jTextArea1.setName("jTextArea1"); // NOI18N 
    jScrollPane1.setViewportView(jTextArea1); 

    jTextField1.setName("jTextField1"); // NOI18N 

    org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(desktopapplication1.DesktopApplication1.class).getContext().getResourceMap(serverg.class); 
    jButton1.setText(resourceMap.getString("jButton1.text")); // NOI18N 
    jButton1.setName("jButton1"); // NOI18N 
    jButton1.addActionListener(new java.awt.event.ActionListener() { 
     public void actionPerformed(java.awt.event.ActionEvent evt) { 
      jButton1ActionPerformed(evt); 
     } 
    }); 

    jLabel1.setName("jLabel1"); // NOI18N 

    javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); 
    getContentPane().setLayout(layout); 
    layout.setHorizontalGroup(
     layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
     .addGroup(layout.createSequentialGroup() 
      .addContainerGap() 
      .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
       .addComponent(jTextField1, javax.swing.GroupLayout.DEFAULT_SIZE, 380, Short.MAX_VALUE) 
       .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 380, Short.MAX_VALUE) 
       .addGroup(layout.createSequentialGroup() 
        .addGap(10, 10, 10) 
        .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 43, javax.swing.GroupLayout.PREFERRED_SIZE) 
        .addGap(98, 98, 98) 
        .addComponent(jButton1, javax.swing.GroupLayout.PREFERRED_SIZE, 68, javax.swing.GroupLayout.PREFERRED_SIZE))) 
      .addContainerGap()) 
    ); 
    layout.setVerticalGroup(
     layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
     .addGroup(layout.createSequentialGroup() 
      .addContainerGap() 
      .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 187, javax.swing.GroupLayout.PREFERRED_SIZE) 
      .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) 
      .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, 51, javax.swing.GroupLayout.PREFERRED_SIZE) 
      .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) 
      .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
       .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 19, javax.swing.GroupLayout.PREFERRED_SIZE) 
       .addComponent(jButton1, javax.swing.GroupLayout.PREFERRED_SIZE, 30, javax.swing.GroupLayout.PREFERRED_SIZE)) 
      .addContainerGap()) 
    ); 

    pack(); 
}// </editor-fold>       

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {           
    String line = jTextField1.getText(); 
    out.println(line); 
    jTextArea1.append("\nServer : " + line); 
}           

/** 
* @param args the command line arguments 
*/ 
public static void main(String args[]) { 

    java.awt.EventQueue.invokeLater(new Runnable() { 

     public void run() { 
      serverg ob=new serverg();     
      ob.setVisible(true);      
      ob. jTextArea1.append("waiting for connection" ); 
      ob.work();    
     } 
    }); 

} 
// Variables declaration - do not modify      
private javax.swing.JButton jButton1; 
private javax.swing.JLabel jLabel1; 
private javax.swing.JScrollPane jScrollPane1; 
private static javax.swing.JTextArea jTextArea1; 
private javax.swing.JTextField jTextField1; 
// End of variables declaration     
} 

답변

3

귀하의 work() 방법은 따라서 귀하의 main() 방법은 두 프로세스는 각각의 스레드에서 실행할 수 있도록 간단하게,이에 work() 방법을 변경, 잘못, 당신의 Swing Application의 일부가 아닌, s=ss.accept();을 작성하여 이벤트 디스패처 스레드를 차단했습니다.

또한 GUI로 변경하려는 사항은 이벤트 디스패처 스레드에서 수행해야하므로 어떤 경우에도 work() 메서드를 변경해야합니다 (자세한 내용은 Concurrency in Swing 참조). 그래서 주 방법을이 방법으로 되 돌리면, 물건을 분류 할 수 있습니다. work() 방법 내부 블록이 같이해야하는 경우이 작업을 위해

public static void main(String args[]) 
{ 
    final serverg ob=new serverg(); 
    java.awt.EventQueue.invokeLater(new Runnable() 
    { 
     public void run() 
     {       
      ob.setVisible(true);      
      ob. jTextArea1.append("waiting for connection" );       
     }  
    }); 
    ob.work(); 
} 

는, 당신은 인스턴스 변수로 line 변수를 선언해야합니다 :

if((line=in.readLine())!=null) 
    SwingUtilities.invokeLater(new Runnable() 
    { 
     public void run() 
     { 
      jTextArea1.append("Client : " + line); 
     } 
    }); 
관련 문제