摆动输出在第一次运行时不会出现

时间:2012-04-21 11:28:02

标签: java swing netbeans

我正在尝试使用netbeans中的swing执行简单的客户端服务器通信。第一次运行时,它显示一个空白窗口。我再次运行它而没有关闭第一个输出窗口,它显示了所需的输出。我附上了代码。

由于

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                   
}

1 个答案:

答案 0 :(得分:3)

您的work()方法不属于您的Swing Application,因此您的main()方法错误,只需将work()方法更改为此方法,以便这两个进程可以在各自的线程上运行,通过编写s=ss.accept();,您阻止了事件调度程序线程。

此外,您希望对GUI进行的更改必须在Event Dispatcher Thread上完成,因此您需要同样更改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()方法中的if块必须如下所示,为此,您必须将line变量声明为实例变量:

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