【问题标题】:ButtonDownFcn of a tool on Matlab GUIDE toolbar is not workingMatlab GUIDE 工具栏上的工具的 ButtonDownFcn 不起作用
【发布时间】:2017-02-09 08:34:56
【问题描述】:

我使用 Matlab GUIDE 在 Matlab 中编写了一个 GUI 程序。 在工具栏上创建了一个工具,写了一个右键回调函数,如下图,但是当我在GUI上右键那个工具时,没有任何反应。

function MyTool_ButtonDownFcn(hObject, eventdata, handles)
waitfor(msgbox('Hello button down function','Hello button down'));
disp('Hello disp');

从属性检查器,ButtonDownFcn 的值为:

@(hObject,eventdata)main('MyTool_ButtonDownFcn',hObject,eventdata,guidata(hObject))

我尝试使用另一个带有回调函数的按钮来执行“键盘”进行调试。

function bugfindbutton_ClickedCallback(hObject, eventdata, handles)
keyboard

这证实了与工具的ButtonDownFcn 关联的函数MyTool_ButtonDownFcn(hObject, eventdata, handles) 的存在,并且不会被任何其他函数删除。但是右键单击该工具既不提供 msgbox 也不提供命令窗口输出。

我想在“MyTool”切换按钮(工具栏上的自定义工具)上单击鼠标右键来执行MyTool_ButtonDownFcn 功能。我该怎么做?

【问题讨论】:

    标签: matlab matlab-figure matlab-guide


    【解决方案1】:

    ButtonDownFcnuitoggletooluipushtool 对象忽略。您应该改用ClickedCallback 属性来设置回调。但是,该回调只会在鼠标左键单击时执行,而不会在鼠标右键单击时触发。

    如果您确实需要将回调绑定到鼠标右键单击,您可以使用文件交换中的findjobj 实用程序来访问底层 Java 对象并分配自定义回调

    h = uitoggletool( ...
        'CData',        rand(16, 16, 3), ...
        'OnCallback',   @(s,e)disp('on'), ...
        'OffCallback',  @(s,e)disp('off'));
    
    % Get the underlying java object using findobj
    jtoggle = findjobj(h);
    
    % Specify a callback to be triggered on any mouse release event
    set(jtoggle, 'MouseReleasedCallback', @(s,e)callback(h,e))
    
    function callback(src, evnt)
        if evnt.getButton() == 3
            disp('Right Click!')
        end
    
        % Get the handles struct
        handles = guidata(src);
    
        % Modify the handles
        handles.value = 2;
    
        % Save the handles
        guidata(src, handles);
    end
    

    【讨论】:

    • 切换工具按钮MyTool 具有有效的OnCallbackOffCallback 功能。因此不能将ClickedCallback 用于另一项任务。使用MouseReleasedCallback,该函数同时执行左键释放和右键单击释放。所以不能使用这个回调,因为它会干扰OnCallbackOffCallback 的左键单击。感谢findjobj 的信息,尽管它没有解决问题。我想在MyTool 切换按钮上再添加一项功能。我认为右键单击是唯一的方法。还有其他想法吗?
    • @Govinda 我已经更新了示例,使其更加彻底。您绝对可以将OnCallbackOffCallbackMouseReleasedCallback 一起使用,您只需要进行回调检查它是否是单击的正确按钮。查看我的更新。
    • 这一直有效,直到我意识到 handles 需要在回调函数中更新。回调函数有callback(hObject, eventdata, handles)语法,所以我没有特别问。但我也需要handles 在回调中更新。你能帮我做吗?
    • @Govinda 已更新以包含一个示例
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-25
    • 2015-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-06
    相关资源
    最近更新 更多