2017-03-15 42 views
0

我用服務器和客戶端(多客戶端)編寫卡片遊戲。如果遊戲開始或遊戲關閉,我需要每秒檢查一次。所以我寫了一個java.swing.timer來檢查它。但是它並沒有在遊戲開始時設置JPanel的可見性。 (對不起,我英文不好)Java搖擺計時器沒有設置JPanel的可見性

即代碼段

public void checkGameState() { 

    ActionListener action; 

    timer = new Timer(delay, (ActionEvent e) -> { 
     try { 
      boolean isEnd = checkIfGameIsClose(); 
      if (isEnd == true) { 
       System.out.println("---->"+isEnd); 
       mainGamePanel.setVisible(false); 
       waitRoomPanel.setVisible(true); 
       availability_button.setText("Ready"); 
       availability_button.setBackground(Color.red); 
       availability_status = false; 
      } 

     } catch (IOException ex) { 
      Logger.getLogger(ClientFrame.class.getName()).log(Level.SEVERE, null, ex); 
     } 

     try { 
      boolean isStart = checkIfGameIsOpen(); 
      if (isStart == true) { 
       System.out.println("---->"+isStart); 
       mainGamePanel.setVisible(true); 
       waitRoomPanel.setVisible(false); 
       clientConnectToServer.isEndTheGame(); 
      } 
     } catch (IOException ex) { 
      Logger.getLogger(ClientFrame.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    }); 
    timer.start(); 


} 

public boolean checkIfGameIsClose() throws IOException { 
    boolean isClosedGame = clientConnectToServer.checkifGameIsEnd(); 
    System.out.println(isClosedGame + " ---> Close"); 
    return isClosedGame; 
} 

public boolean checkIfGameIsOpen() throws IOException { 
    boolean gameIsStart = clientConnectToServer.startGame(); 
    System.out.println(gameIsStart + "---> open"); 
    return gameIsStart; 
} 

然後開始遊戲方法checkIfGameIsOpen()返回true。 然後遊戲關閉方法checkIfGameIsClose()返回true。

mainGamePanel是Panel在遊戲開始時應該出現的內容。

+0

您是否驗證/佈置父面板,當兒童的可見性發生變化時? –

+0

爲面板的容器(或窗口的根窗格)調用方法'revalidate()'和'repaint()'。 –

回答

4

問題和可能的解決方案:

  1. 您更改JPanels的可見性狀態,但不通知持有它們,你已經做到了這一點的容器。進行所有這些更改後,您應該在此容器上致電revalidate()repaint()。第一個是重新驗證,告訴容器及其佈局管理器重新佈置所有包含的組件,第二個重新繪製請求JVM重新繪製容器及其所有子組件。這將有助於清除容器中的「髒」像素。
  2. 更好的辦法是使用CardLayout來交換可見性,那麼你就不需要上面提到的東西。該教程可以在這裏找到:CardLayout tutorial
  3. 你不告訴我們你的調試println是否顯示。
  4. 您目前的解決方案是使用間歇輪詢服務器的遊戲狀態,這是一種易碎的kludge解決方案。更好的辦法是在服務器通知所有客戶端遊戲狀態發生變化的情況下使用通知解決方案,然後客戶端可以處理此通知。
+0

所有此解決方案無法使用! –

+0

@BenAfleek:那麼你可能在代碼中遇到其他問題,而你沒有向我們展示。考慮在你的問題中創建併發布[mcve]代碼。 –