3

我在我的中实现了各种uimenus,uitable但出现了一个非常烦人的行为。

function createUItable

    h = figure
    ...

    uimenu(h,'Label','MenuButton','Callback',@someAction)

end
%---------
function someAction(~,~)
    %some action
end

但是在执行回调函数之后,菜单按钮仍然被按下并突出显示,甚至没有,当我滑过下一个菜单按钮时,这个也被触发了!

Matlab Central 也描述了这种行为,但没有解决方案。

我尝试了建议:

function someAction(~,~)
    %some action
    set(gcbo,'Enable','off')
    drawnow
    set(gcbo,'Enable','on')
end

这不会改变任何东西。set(gcbo,'Enable','off')单独可以解决滑动问题,但也会禁用整个按钮,这是我不想要的。我还尝试使用“Checked”、“Visible”和“Interuptible”属性,但没有成功。这个问题一定要知道,有什么提示吗?

我还考虑过使用uicontrol而不是uimenu使用按钮,但我没有得到它的工作。


编辑:当我将菜单按钮放入子菜单时,它可以完美运行:

button = uimenu(h,'Label','MenuButton');
uimenu(button,'Label','MenuButton','Callback',@someAction)

Edit2:Apushbutton也可以,但我怎么能把它放到菜单栏中呢?

4

2 回答 2

3

我猜MATLAB实现是这样的,因为在顶层菜单设置回调很奇怪。自然地,在 GUI(不仅是 MATLAB)中,当您单击顶级菜单(如“文件”、“编辑”等)时,标准行为是弹出打开子菜单而不是立即执行操作。因此,您应该只使用顶级回调来动态创建/修改相关的子菜单。

我认为有两种选择:

1)如果您想坚持这种方式(一个始终可见的类似按钮的元素),那么您应该通过 a 使用工具栏uipushtool

hToolbar = uitoolbar(parentFigure);
uipushtool(hToolbar, 'ClickedCallback', @someAction);

但是,这没有该'Label'属性,因此您必须使用'CData'并且可能是'TooltipString'.

2) 创建一个包含实际操作菜单的顶级菜单:

topMenu = uimenu(parent, 'Label', 'Actions');
uimenu(topMenu, 'Label', 'MenuButton', 'callback', @someAction)

从 GUI 设计的一般角度来看,这两种选择都具有作为更常用的样式的好处,因此对任何用户来说都更直观。

于 2013-10-17T10:49:33.303 回答
1

我发现了一个有趣的解决这个问题的方法,同时将回调保留在 TOP 菜​​单中。原来,使用 uistack 函数从菜单项释放焦点,所以在顶级菜单回调中,我放置

uistack(hObj,'down'); 
uistack(hObj,'up'); 
drawnow; 

这对实际订购没有任何作用,但会释放菜单项的焦点。

于 2016-11-10T20:21:55.590 回答