我正在用 Java 编写客户端/服务器程序(包括 GUI)。
我在客户端有以下代码:
public class SBListener implements ActionListener{
public void actionPerformed(ActionEvent e){
try{
outToServer.writeUTF(usn.getText().trim());
System.out.println("sent username to server");
playerExists = inToClient.readBoolean();
System.out.println("past getting player");
System.out.println("player exists = " + playerExists);
}catch(IOException a){
System.err.println(a);
}
if(playerExists == false){
JButton submitInfo = new JButton("submit info");
submitInfo.addActionListener(new SBNewInfoListener());
init.add(new JLabel(""));//dummy element to get the right alignment
init.add(new JLabel("First Name:"));
init.add(fn);
init.add(new JLabel("Last Name:"));
init.add(ln);
init.add(submitInfo);
add(init, BorderLayout.WEST);
init.setVisible(true);
init.revalidate();
init.repaint();
}
}
}
以及服务器中的以下代码:
String username = inp.readUTF();
System.out.println(username);
out.writeBoolean(false);
System.out.println("wrote boolean, waiting for fn/ln/un");
fn = inp.readUTF();
System.out.println("got fn");
ln = inp.readUTF();
un = inp.readUTF();
但是,当单击调用 SBListener 的按钮时,程序会在到达服务器等待 fn/ln/username 的位置时冻结。我添加了一堆 system.out 语句进行调试,然后我得到了一条“写了布尔值,等待 fn/ln/un”的语句。
基本上,我试图在服务器返回错误值后更新屏幕。具体来说,我想为名字和姓氏添加两个文本字段。然后我想将这些值发送到服务器。
谁能告诉我如何解决这个问题?预先感谢您的任何帮助!
不要在 ActionListener 中执行客户端/服务器代码。这将导致事件调度线程在等待服务器响应时阻塞。当 EDT 被阻止时,整个 GUI 就会冻结。
阅读 Swing 教程中的部分并发性了解更多信息。您需要为客户端/服务器代码使用单独的线程。或者你可以使用SwingWorker
正如教程中所讨论的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)