ある種の同期を追加する必要がありますか? サーバーとの TCP 通信を管理する別のスレッドを作成します。流れはこうです。
private void sendLetterButtonActionPerformed(java.awt.event.ActionEvent evt) {
try {
// TODO add your handling code here:
session.getCurrentMatch().guessALetter(this.letterTextField.getText());
} catch (Exception ex) {
JOptionPane.showMessageDialog(this, "Please insert one letter only");
}}
public void guessALetter(String l) throws Exception {
DataPacket dp = new DataPacket();
Communicator c = new Communicator(p, session);
c.start();
}
public class Communicator extends Thread {
private Packet packet;
private Session session;
public Communicator(Packet p, Session s) {
this.session = s;
this.packet = p;
}
public void run() {
System.out.println("Communicator: "+Thread.currentThread());
Socket socket = session.getClientSocket();
ObjectOutputStream out = session.getOut();
ObjectInputStream in = session.getIn();
ResponsePacket reply;
try {
out.writeObject(this.packet);
out.flush();
reply = (ResponsePacket) in.readObject();
System.out.println("Received" + reply.getCurrentWordView() + reply.getCurrentWordView());
session.getCurrentMatch().setLastReply(reply);
session.getCurrentMatch().manageResponsePacket(reply);
} catch (ClassNotFoundException ex) {
Logger.getLogger(Communicator.class.getName()).log(Level.SEVERE, null, ex);
} catch (IOException ex) {
Logger.getLogger(Communicator.class.getName()).log(Level.SEVERE, null, ex);
}finally{
}}}
public void manageResponsePacket(ResponsePacket reply) {
this.setLastReply(reply);
if (reply.isGameMode()) {
setWordView(reply.getCurrentWordView());
setCounter(reply.getFailedAttemptsCounter());
setChanged();
notifyObservers(EventEnum.GAMERESPONSE);
} else if (reply.isGameOverMode()) {
}
}
ご覧のとおり、2 番目のスレッドは GUI を更新するスレッドです。