如何让Matlab UIFigure关闭弹窗后重新获取焦点?
问题
需要实现功能:按下空格键弹出游戏暂停窗口,关闭该弹窗后,主UIFigure能重新接收键盘输入。尝试过figure(fig)、JavaFrame、最小化再最大化窗口、隐藏再显示窗口、更新窗口等方法,均无效。不需要窗口必须获得焦点,只要能继续接收键盘输入即可。
以下是精简后的测试代码,仅在检测到按键时在控制台输出对应信息:
测试代码
function Main() clc; % 创建UIFigure并设置属性 fig = uifigure('Name', 'Snake Game'); % 设置窗口标题 fig.Position = [100 100 620 620]; % 窗口位置和大小 % 在UIFigure内创建坐标轴 ax = uiaxes(fig); ax.Position = [10 10 600 600]; % 坐标轴在窗口内的位置 ax.XColor = 'none'; ax.YColor = 'none'; ax.Color = 'k'; % 背景颜色 ax.DataAspectRatio = [1 1 1]; % 确保绘图为正方形 screenSize = 600; ax.XLim = [-screenSize/2, screenSize/2]; ax.YLim = [-screenSize/2, screenSize/2]; hold(ax, 'on'); % 设置初始游戏状态(未暂停) gameData.game_paused = false; fig.UserData = gameData; % 将游戏状态存储在figure的UserData中 % 控制监听器 fig.KeyPressFcn = @(src, event) keyDown(event.Key, fig); % 传递figure句柄 game_ongoing = true; while game_ongoing pause(0.05); % 从figure的UserData中获取游戏状态 gameData = fig.UserData; if gameData.game_paused % 在游戏窗口中显示暂停菜单 msg = "Continue the Game?"; title = "Snake Game"; selection = uiconfirm(fig, msg, title, ... "Options", ["Resume", "Open Settings", "Quit"], ... "DefaultOption", 1, "CancelOption", 2); switch selection case 'Resume' gameData.game_paused = false; % 恢复游戏 fig.UserData = gameData; % 通过最小化再还原窗口尝试重新获取焦点 fig.WindowState = 'minimized'; % 最小化窗口 pause(0.1); % 短暂暂停确保系统识别 fig.WindowState = 'normal'; % 恢复窗口至正常状态 case 'Open Settings' disp("Opening Settings. . ."); case 'Quit' delete(fig); % 关闭游戏窗口 return; end end end end function keyDown(key, fig) % 获取当前游戏状态 gameData = fig.UserData; switch key case {'uparrow', 'w'} disp("up") case {'downarrow', 's'} disp("down") case {'leftarrow', 'a'} disp("left") case {'rightarrow', 'd'} disp("right") case {'space'} % 切换暂停状态并显示暂停菜单 if ~gameData.game_paused gameData.game_paused = true; % 设置游戏为暂停状态 fig.UserData = gameData; % 保存更新后的状态 end end end
内容的提问来源于stack exchange,提问作者Dolphin
相关产品推荐
相关产品推荐

