Java swing计时器不设置JPanel的可见性

时间:2017-03-15 14:45:14

标签: java swing

我用服务器和客户端(多客户端)写了一个纸牌游戏。如果游戏开始或游戏关闭,我需要检查每一秒。所以我写了一个java.swing.timer来检查它。但是在游戏开始时它没有设置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在游戏开始时应该出现的内容。

1 个答案:

答案 0 :(得分:4)

问题和可能的解决方案:

  1. 您更改了JPanels的可见性状态,但不通知容纳它们的容器您已完成此操作。在进行所有此类更改后,您应该在此容器上调用revalidate()repaint()。第一个,revalidate,告诉容器及其布局管理器重新布局所有包含的组件,第二个重绘,请求JVM重新绘制容器及其所有子容器。这将有助于清除容器中的“脏”像素。
  2. 更好的方法是使用CardLayout交换可见性,然后你不需要我上面提到的内容。可以在此处找到该教程:CardLayout tutorial
  3. 您没有告诉我们您的调试println是否正在显示。
  4. 您当前的解决方案是使用间歇性轮询服务器的游戏状态,这是一个脆弱的kludge解决方案。更好的是使用通知解决方案,其中服务器通知所有客户端游戏状态的变化,然后客户端可以对此通知采取行动。