2012-04-21 6 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()方法は、プロセスの両方がそれぞれのスレッドで実行できるように、単純に、これまであなたのwork()方法を変更する、それ故にあなたのmain()方法が間違っている、あなたのSwing Applicationの一部ではありません、 s=ss.accept();と書いて、イベントディスパッチャースレッドをブロックしました。

さらに、GUIへの変更はイベントディスパッチャスレッドで行う必要があるため、work()メソッドを同様に変更する必要があります。詳しくは、Concurrency in Swingを参照してください。あなたの主な方法をこのように戻して、物事を整理してください。

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

これが機能するためにwork()メソッド内のブロックは、このように見なければならない場合はあなたの、あなたはインスタンス変数としてあなたline変数を宣言する必要があります。

if((line=in.readLine())!=null) 
    SwingUtilities.invokeLater(new Runnable() 
    { 
     public void run() 
     { 
      jTextArea1.append("Client : " + line); 
     } 
    }); 
関連する問題