使用键绑定时如何保留窗口状态

问题描述

我目前正在开发一款基于客户端-服务器架构的游戏。基本上发生的是,一个玩家可以创建一个大厅,其他人可以通过提供 IP 地址和端口号(因此,实际上是基本的 Java 套接字)来连接到大厅。在实际游戏开始之前,所有玩家首先被放置在一个大厅中,该大厅由一个显示玩家数量的 JLabel 和一个提供有关人们加入或离开大厅的信息的 JTextArea 组成。每当有新玩家连接或有人离开大厅时,主机都会向客户端推送通知,以相应地更新其 UI。

现在的问题如下:如果用户喜欢,我希望大厅可以全屏显示(这也已经使用键绑定/输入/动作映射实现了)。但是,当用户从窗口更改为全屏或返回时,必须处理当前帧并因此重置为初始大厅状态。我最初想使用类 LobbyState解决这个问题,该类存储要恢复的所有相关数据。但是,不知何故这不起作用,因为在更改“窗口模式”时,框架仍然显示大厅的初始状态。

为了让您深入了解代码,这是 Lobby 类的相关代码

private int playerCount = 1;
private boolean isHost;

public Lobby(Integer windowState,Image image,Boolean isHost,LobbyState lobbyState) {

    this.isHost = isHost;
    
    setDefaultCloSEOperation(EXIT_ON_CLOSE);
    setTitle("Lobby");
    setExtendedState(MAXIMIZED_BOTH);
    setSize(screenDim);
    setMinimumSize(new Dimension(800,400));

    setIconImage(image);
    
    if (windowState == 1) {
        setUndecorated(true);
    } else {
        setUndecorated(false);
    }
    setResizable(true);

    contentPane.setLayout(null);
    setLayout(null);
    contentPane.getInputMap(KeyBindings.AFC).put(Keystroke.getKeystroke("F11"),"lobby_fullscreen");
    contentPane.getActionMap().put("lobby_fullscreen",new EnterFullscreen(this,this.isHost,new LobbyState(playerCount,getLobbyHistory())));
    contentPane.setBackground(new Color(253,205,136));
    setContentPane(contentPane);

    loadComponents();
    loadBounds();
    addActionListeners();

    if (lobbyState != null) {
        lblPlayerCount.setText("" + lobbyState.getPlayerCount());
        txtLobbyHistory.setText(lobbyState.getLobbyHistory());
    }
    
    setVisible(true);

}

我的第一个假设为什么 F11 会以初始状态而不是当前状态触发大厅的创建,即 ActionMap 是在 playerCount 仍为 1 且 {{ 1}} 不返回任何内容,因为实际上仍然没有大厅历史记录。如果这确实是问题所在,是否有可能告诉 ActionMap 在按下 getLobbyHistory() 时重新读取 playerCountgetLobbyHistory() 的值?我是否必须删除当前的 ActionMap 并添加一个新的 ActionMap,还是有更优雅的方法解决这个问题?

如果您对此感兴趣,这是当前执行窗口和全屏应用程序之间切换的代码

F11

我非常感谢您提供有关如何解决此问题以及如何正确实现此类目标的任何意见。如果您觉得缺少解决此问题的任何信息或代码,请告诉我,我会尽快提供。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)