Я делаю сетевую игру «Броненосец» для школьного проекта. GUI имеет сетку JButtons
, которая служит игровой панелью. Когда пользователь нажимает кнопку, он вызывает метод sendShot()
. Этот метод отправляет свой снимок на удаленный компьютер, который проверяет, является ли его ударом или пропуском и возвращает результат. Затем первая машина получает этот результат и соответственно обновляет свой графический интерфейс. Код, который у меня есть, делает это, но проблема в том, что графический интерфейс не обновляется до тех пор, пока другая машина не отправит свой следующий снимок. Я предполагаю, что это потому, что я вызываю recieveShot()
из метода sendShot()
, но я не на 100% понятен почему, так как метод обновления GUI (gp.ob.updateBoard(sr))
) вызывается до receiveShot()
. Что я не понимаю здесь?GUI не обновляется, как ожидалось/проблема управления потоком
Кроме того, у меня возникает ощущение, что мой базовый метод потока программ здесь ошибочен и что 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();}
}
Возможно, это не имеет никакого отношения к этому, но вы дважды читаете «ShotResult» из потока ... один раз в 'sendShot' и еще раз в' recieveShot'. Кроме того, нам может потребоваться больше кода, прежде чем мы сможем вывести общую проблему ... – MadProgrammer
вы можете вставить [SSCCE] (http://sscce.org) для быстрой справки. – Ashish