在对象之间交换属性值

时间:2011-07-15 11:24:40

标签: user-interface matlab figure

我通过图中的注释(。)创建了两个文本框。他们的大多数属性已被定义;并且回调函数允许在窗口中拖放动作。我为盒子创建了一个uicontextmenu。在右键单击时,可以从后续操作中选择功能列表。

我尝试添加的其中一个操作涉及在两个框之间交换字符串。我需要获取我当前右键单击的框的字符串,它应该与我随后左键单击的框中的字符串交换。我可以获得有关如何扩展uimenu函数以便注册后续左键单击的建议吗?

1 个答案:

答案 0 :(得分:1)

您需要手动存储最后点击的框。如果您使用GUIDE设计GUI,请使用传递给回调函数的handles结构。否则,如果以编程方式生成组件,则嵌套回调函数可以访问在其封闭函数内定义的变量。

修改

这是一个完整的示例:右键单击并从上下文菜单中选择“交换”,然后选择另一个文本框以交换字符串(左键单击)。请注意,我必须在两个步骤之间禁用/启用文本框才能触发ButtonDownFcn(请参阅此page以获取解释)

function myTestGUI
    %# create GUI
    hLastBox = [];          %# handle to textbox initiating swap
    isFirstTime = true;     %# show message box only once
    h(1) = uicontrol('style','edit', 'string','1', 'position',[100 200 60 20]);
    h(2) = uicontrol('style','edit', 'string','2', 'position',[400 200 60 20]);
    h(3) = uicontrol('style','edit', 'string','3', 'position',[250 300 60 20]);
    h(4) = uicontrol('style','edit', 'string','4', 'position',[250 100 60 20]);

    %# create context menu and attach to textboxes
    hCMenu = uicontextmenu;
    uimenu(hCMenu, 'Label','Swap String...', 'Callback', @swapBeginCallback);
    set(h, 'uicontextmenu',hCMenu)

    function swapBeginCallback(hObj,ev)
        %# save the handle of the textbox we right clicked on
        hLastBox = gco;

        %# we must disable textboxes to be able to fire the ButtonDownFcn
        set(h, 'ButtonDownFcn',@swapEndCallback)
        set(h, 'Enable','off')

        %# show instruction to user
        if isFirstTime
            isFirstTime = false;
            msgbox('Now select textbox you want to switch string with');
        end
    end
    function swapEndCallback(hObj,ev)
        %# re-enable textboxes, and reset ButtonDownFcn handler
        set(h, 'Enable','on')
        set(h, 'ButtonDownFcn',[])

        %# swap strings
        str = get(gcbo,'String');
        set(gcbo, 'String',get(hLastBox,'String'))
        set(hLastBox, 'String',str)
    end
end

screenshot