如何解决使用键绑定时如何保留窗口状态
我目前正在开发一款基于客户端-服务器架构的游戏。基本上发生的是,一个玩家可以创建一个大厅,其他人可以通过提供 IP 地址和端口号(因此,实际上是基本的 Java 套接字)来连接到大厅。在实际游戏开始之前,所有玩家首先被放置在一个大厅中,该大厅由一个显示玩家数量的 JLabel 和一个提供有关人们加入或离开大厅的信息的 JTextArea 组成。每当有新玩家连接或有人离开大厅时,主机都会向客户端推送通知,以相应地更新其 UI。
现在的问题如下:如果用户喜欢,我希望大厅可以全屏显示(这也已经使用键绑定/输入/动作映射实现了)。但是,当用户从窗口更改为全屏或返回时,必须处理当前帧并因此重置为初始大厅状态。我最初想使用类 LobbyState
来解决这个问题,该类存储要恢复的所有相关数据。但是,不知何故这不起作用,因为在更改“窗口模式”时,框架仍然显示大厅的初始状态。
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()
时重新读取 playerCount
和 getLobbyHistory()
的值?我是否必须删除当前的 ActionMap 并添加一个新的 ActionMap,还是有更优雅的方法来解决这个问题?
如果您对此感兴趣,这是当前执行窗口和全屏应用程序之间切换的代码:
F11
我非常感谢您提供有关如何解决此问题以及如何正确实现此类目标的任何意见。如果您觉得缺少解决此问题的任何信息或代码,请告诉我,我会尽快提供。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。