按下按钮可禁用键盘输入

时间:2014-04-08 11:39:06

标签: matlab user-interface

我的Matlab GUI中有一个奇怪的问题。 GUI包含uipanelicontrol个对象,其中一些是按钮。通常,GUI由方向箭头键控制。

但是,一旦我点击其中一个按钮,键盘事件就不再记录了。我在按键回调中设置了断点,以找出发生了什么,结果发现回调从未被调用过。如果我设法点击GUI背景,它再次工作,这让我觉得它与主动控件有关。但是如何将控制权交还给主窗口? uicontrol(hFigure)不起作用,figure(hFigure)也不起作用。

以下代码段会重现此问题。将其复制到一个新文件(理想情况下称为test.m,否则Code Analyzer会抱怨)并运行它以打开一个显示此行为的GUI窗口。点击按钮后,除非用户点击text uicontrol以外的区域,否则不会再记录箭头键。

function test
    figure('KeyPressFcn',@key)
    clf
    p = uipanel('position',[0 0 1 1],'BackgroundColor',[.7 .7 .7]);
    uicontrol('Style','push','String','Click me','Units','norm',...
        'Position',[0.43 0.91 0.14 0.06],'Callback',@button);
    t = uicontrol(p,'Style','text','String','Use arrow keys','Units','norm',...
        'Position',[0.2 0.4 0.6 0.2],'FontSize',20);

    function button(~,~)
        set(t,'String','Button pressed.');
    end

    function key(~,e)
        set(t,'String',['Key ' e.Key ' pressed.']);
    end
end

2 个答案:

答案 0 :(得分:1)

你说这不起作用是正确的。单击按钮时,图形不再是活动控件。解决此问题的最佳方法是另外将按钮的KeyPressFcn属性设置为与图的KeyPressFcn相同。

function test
    figure('KeyPressFcn',@key)
    clf
    p = uipanel('position',[0 0 1 1],'BackgroundColor',[.7 .7 .7]);
    uicontrol('Style','push','String','Click me','Units','norm',...
        'Position',[0.43 0.91 0.14 0.06],'Callback',@button, ...
        'KeyPressFcn', @key);
    t = uicontrol(p,'Style','text','String','Use arrow keys','Units','norm',...
        'Position',[0.2 0.4 0.6 0.2],'FontSize',20);

    function button(~,~)
        set(t,'String','Button pressed.');
    end

    function key(~,e)
        set(t,'String',['Key ' e.Key ' pressed.']);
    end
end

答案 1 :(得分:1)

您也可以设置WindowKeyPressFcn而不是KeyPressFcn 有关更多信息,请参阅我的回答:
matlab: difference between KeyPressFcn and WindowKeyPressFcn