2017-03-15 18 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. あなたがのJPanelの表示状態を変更するが、あなたがこれをやったこと、それらを保持するコンテナに通知しません。このような変更をすべて行った後、revalidate()repaint()に電話する必要があります。最初に、revalidateは、コンテナとそのレイアウトマネージャに、含まれているすべてのコンポーネントを再レイアウトするように指示し、2回目の再描画は、JVMがコンテナとそのすべての子を再描画することを要求します。これは、コンテナの「汚れた」ピクセルを取り除くのに役立ちます。
  2. 可視性を交換するためにCardLayoutを使用するほうがはるかに優れています。上で述べたことは必要ありません。このチュートリアルはCardLayout tutorialにあります。
  3. デバッグプリントが表示されているかどうかはわかりません。
  4. 現在の解決方法は、サーバーのゲーム状態の断続的なポーリングを使用することです。これは脆弱なクルージングソリューションです。サーバーがゲームの状態の変化をすべてのクライアントに通知し、クライアントがこの通知を処理できる通知ソリューションを使用する方がずっと優れています。
+0

このソリューションはすべて動作しません! –

+0

@BenAfleek:あなたが私たちに見せていないコードに他の問題がある可能性があります。あなたの質問に[mcve]コードを作成して投稿することを検討してください。 –

関連する問題