我正在为学校项目制作网络战舰游戏。 GUI具有JButtons
网格作为游戏板。当用户点击按钮时,它会调用下面的sendShot()
方法。此方法将其镜头发送到远程计算机,远程计算机检查其是命中还是未命中并返回结果。然后,第一台机器接收该结果并相应地更新其GUI。我在下面的代码是这样做的,但我的问题是GUI在其他机器发送下一个镜头之前没有更新。我猜这是因为我在recieveShot()
方法中调用sendShot()
,但我不清楚为什么,因为更新GUI的方法(gp.ob.updateBoard(sr))
)在receiveShot()
之前调用。我在这里误解了什么?
此外,我觉得我的基本程序流方法存在缺陷,并且不应该从receiveShot()
方法调用sendShot()
。这个方案有没有明显的替代方案?
void sendShot(ShotAttempt sa){
try {
oos.writeObject(sa);
oos.flush();
System.out.println("shot fired");
ShotResult sr = (ShotResult)ois.readObject();
gp.ob.updateBoard(sr);
} catch (IOException | ClassNotFoundException e) {
System.out.println(e.printStackTrace());}
receiveShot();
}
void receiveShot(){
try{
ShotAttempt sa = (ShotAttempt)ois.readObject();
ShotResult sr = gp.db.acceptShot(sa);
oos.writeObject(sr);
oos.flush();
} catch (IOException | ClassNotFoundException e){e.printStackTrace();}
}
答案 0 :(得分:2)
在其他机器发送下一个镜头之前,GUI才会更新。我猜这是因为我在sendShot()方法中调用recieveShot(),但我不是100%清楚为什么,因为更新GUI的方法(gp.ob.updateBoard(sr)) )在receiveShot()之前调用。
receiveShot()
方法阻止Swing事件调度线程或EDT。由于此线程负责所有Swing图形,用户交互和Swing事件处理,因此即使它们在调用receiveShot()
方法之前排队,也不会处理在事件线程上排队等待处理的Runnables。它们只能在线程被解除阻塞时进行处理,这将在您收到镜头后进行处理。
建议:
setState(State state)
方法。setState(newState)
来更新程序的状态。有关Swing Event Dispatch Thread的更多信息,请查看Concurrency in Swing。