This question is unlikely to help any future visitors; it is only relevant to a small geographic area, a specific moment in time, or an extraordinarily narrow situation that is not generally applicable to the worldwide audience of the internet. For help making this question more broadly applicable, visit the help center。
7年前关闭。
我是否需要添加某种同步?我创建另一个线程来管理与服务器的TCP通信。流程是这样的:
如您所见,第二个线程是更新gui的那个线程。
7年前关闭。
我是否需要添加某种同步?我创建另一个线程来管理与服务器的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()) {
}
}
如您所见,第二个线程是更新gui的那个线程。
最佳答案
如果manageResponsePacket()
更新了swing / awt GUI,则有问题。您只能在EDT上更新摆动/自动GUI。使用SwingUtilities.invokeLater()
使用ResponsePacket更新GUI。