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

标签 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是游戏开始时应该出现的面板。

最佳答案

问题和可能的解决方案:

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

关于Java swing 计时器不设置 JPanel 的可见性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42813019/

相关文章:

java - 如何使 JComboBox 下拉列表在 JTable 中始终可见

java - 如何在JXBrowser 4.1中使用网络摄像头界面

java - 鼠标监听器和按键

java - 是否有特定的方法来处理 JNA 中结构的 const 指针成员?

C++ 的 Java 等价物 +'s "std::string::find_first_of"

java - JFrame 显示黑屏,右上角有一个白色的小矩形

java - 右键单击多项选择和 JPopupMenu

java - 如何将 TextField 中的输入字符串显示到 TextArea 中?

java - 如何分别获取每个元素的所有属性?

java - 插入数据时出现无效数据库路径错误