You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 22:23:27