繁体   English   中英

Java Swing计时器未设置JPanel的可见性

[英]Java swing timer does not set visibility of JPanel

我用服务器和客户端(多客户端)编写纸牌游戏。 而且我需要每秒检查一次游戏是否启动或关闭。 所以我写了一个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. 您更改了JPanels的可见性状态,但不通知已保存它们的容器。 进行所有此类更改后,应在此容器上调用revalidate()repaint() 第一个重新验证,告诉容器及其布局管理器重新布局所有包含的组件,第二个重新绘制,请求JVM重新绘制容器及其所有子组件。 这将有助于消除“脏”像素的容器。
  2. 更好的方法是使用CardLayout交换可见性,那么您将不需要我上面提到的内容。 可以在这里找到该教程: CardLayout教程
  3. 您没有告诉我们您的调试println是否正在显示。
  4. 您当前的解决方案是使用间歇性轮询服务器的游戏状态,这是一种脆弱的冲突解决方案。 更好的方法是使用通知解决方案,其中服务器将游戏状态的更改通知所有客户端,然后客户端可以对此通知采取行动。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM