Matlab GUIDE工具栏上的工具的按钮DownFcn不工作

Matlab GUIDE工具栏上的工具的按钮DownFcn不工作,matlab,matlab-figure,matlab-guide,Matlab,Matlab Figure,Matlab Guide,我已经用Matlab编写了一个GUI程序。 在工具栏上创建了一个工具,并编写了如下所示的右键单击回调函数,但当我在GUI上右键单击该工具时,没有响应 function MyTool_ButtonDownFcn(hObject, eventdata, handles) waitfor(msgbox('Hello button down function','Hello button down')); disp('Hello disp'); 从属性检查器中,ButtonDownFcn的值为: @(

我已经用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\u ButtonDownFcn(hObject、eventdata、handles)
的存在,并且不会被任何其他函数删除。但右键单击该工具既不会提供msgbox也不会提供命令窗口输出


我想用鼠标右键单击“MyTool”切换按钮(工具栏上的自定义工具),以执行
MyTool\u按钮downfcn
功能。如何操作?

对于
uitoggletool
uipushtool
对象,忽略
按钮downfcn
。您应该改为使用
ClickedCallback
属性设置回调。但是,该回调仅在鼠标左键单击时执行,而不会在鼠标右键单击时触发

如果确实需要将回调绑定到鼠标右键单击,可以使用文件交换中的实用程序访问底层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

对于
uitoggletool
uipushtool
对象,忽略
按钮downfcn
。您应该改为使用
ClickedCallback
属性设置回调。但是,该回调仅在鼠标左键单击时执行,而不会在鼠标右键单击时触发

如果确实需要将回调绑定到鼠标右键单击,可以使用文件交换中的实用程序访问底层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
具有有效的
OnCallback
OffCallback
功能。因此,不能将
ClickedCallback
用于另一个任务。使用
MouseReleasedCallback
,该函数同时执行两种情况:左键单击释放和右键单击释放。因此,无法使用此回调,因为它会干扰左键单击
OnCallback
OffCallback
。感谢您提供有关
findjobj
的信息,尽管它没有解决问题。我想在
MyTool
toggle按钮上再添加一个功能。我认为右键点击是唯一的方法。你有什么想法吗?@Govinda我已经更新了这个例子,让它更全面一点。您完全可以将
OnCallback
OffCallback
MouseReleasedCallback
结合使用,您只需进行回调检查,确认单击的是正确的按钮。查看我的更新。这一直有效,直到我意识到需要在回调函数内部更新
句柄。回调函数有
回调(hObject、eventdata、handles)
语法,所以我没有特别询问。但是我也需要
句柄
在回调中更新。你能帮我也这么做吗?@Govinda更新了一个例子,说明切换工具按钮
MyTool
具有有效的
OnCallback
OffCallback
功能。因此,不能将
ClickedCallback
用于另一个任务。使用
MouseReleasedCallback
,该函数同时执行两种情况:左键单击释放和右键单击释放。因此,无法使用此回调,因为它会干扰左键单击
OnCallback
OffCallback
。感谢您提供有关
findjobj
的信息,尽管它没有解决问题。我想在
MyTool
toggle按钮上再添加一个功能。我认为右键点击是唯一的方法。你有什么想法吗?@Govinda我已经更新了这个例子,让它更全面一点。您完全可以将
OnCallback
OffCallback
MouseReleasedCallback
结合使用,您只需进行回调检查,确认单击的是正确的按钮。查看我的更新。这一直有效,直到我意识到需要在回调函数内部更新
句柄。回调函数有
回调(hObject、eventdata、handles)
语法,所以我没有特别询问。但是我也需要
句柄
在回调中更新。你能帮我也这么做吗?@Govinda更新了一个例子