2016-10-30 4 views
0

Okay, ich versuche, einen Tic Tac Toe zu machen, der eine Netzwerkoption hat. Ich habe diesen Code geschrieben, aber ich habe ein kleines Problem.Java Tic Tac Toe Vernetzung

public void actionPerformed(ActionEvent e) 
{  
    JButton temp=(JButton)e.getSource(); 
    //temp.setText("X"); 
    if(turn%2==0) 
    { 
     temp.setText("X"); 
     temp.setIcon(gui.imgX); 
     temp.setDisabledIcon(gui.imgX); 
     gui.repaint(); 
     gui.revalidate(); 
     turn++; 
     try { 
      for(int i=0;i<gui.buttons.length;i++) 
       if(temp==gui.buttons[i]) 
        out.write(i); 
     } catch (IOException e1) { 
      e1.printStackTrace(); 
     } 
    } 
    if(turn%2==1) 
    { 
      try { 
      System.out.println(turn); 
      gui.buttons[in.read()].setText("O"); 
      gui.revalidate(); 
      System.out.println(turn); 
     } catch (IOException e1) { 
      // TODO Auto-generated catch block 
      e1.printStackTrace(); 
     } 
     turn++; 
    }  
} 

Okay, so, wenn ich auf eine Schaltfläche klicken, wird es in den nächsten, wenn die Bedingung (Turn% 2 == 0), aber nicht auf die Schaltfläche Symbol oder Text festgelegt. Es setzt es jedoch irgendwie in den Hintergrund, so dass Icon und Text NUR dann sichtbar werden, wenn es den gesamten actionPerformed beendet und ein int vom anderen PC liest. Im Grunde zeigt es "X" und "O" zusammen nach Abschluss der gesamten actionPerformed-Methode. Wie kann ich das beheben, so zeigt es "X", wenn eine Taste gedrückt wird, ohne zu warten, um von dem anderen PC zu lesen. Beachten Sie, dass es das int erfolgreich in den anderen PC schreibt und der Button text/icon dort geändert wird, ohne auf die andere if-Bedingung zu warten.

+0

Derzeit mischen Sie die UI-Dinge mit der Logik/Controller. Ich denke, es wäre hilfreich, wenn Sie es teilen. I.e. Während der Verarbeitung des ActionEvent warten Sie auf die Antwort vom "Remote Player" und blockieren alle anderen UI-Dinge. Ich würde versuchen, das Steuerelement (wer es dreht und von der Remote-Station liest) in einen Hintergrund-Thread zu verschieben und dann die Benutzeroberfläche nur zu aktualisieren, wenn ich an der Reihe war oder die Informationen vom Remote-Player erhalten habe. –

+0

@StefanFreitag Vielen Dank, du hättest das als Antwort posten sollen :) – Ahmed

Antwort

1

Derzeit mischen Sie die UI-Dinge mit der Logik/Controller. Ich denke, es wäre hilfreich, wenn Sie es teilen. I.e. Während der Verarbeitung des ActionEvent warten Sie auf die Antwort vom "Remote Player" und blockieren alle anderen UI-Dinge.

Ich würde versuchen, das Steuerelement (wer dreht es ist und Lesen von Remote-Station) in einen Hintergrund Thread und dann aktualisieren Sie die Benutzeroberfläche nur, wenn mein Zug ausgeführt wurde oder ich die Informationen vom Remote Player erhalten.