2014-04-08 96 views
0

我的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 

回答

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 
+0

现在我觉得很傻...... – scenia