我正在尝试使用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
}
答案 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 );
}
});