2017-02-07 14 views
1

Я написал программу GUI в Matlab, используя Matlab GUIDE. Создал инструмент на панели инструментов и написал функцию обратного вызова правой кнопкой мыши, как показано ниже, но когда я делаю правый щелчок по этому инструменту в графическом интерфейсе, ответа нет.ButtonDownFcn инструмента на панели инструментов Matlab GUIDE не работает

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 

Это подтвердил существование функции MyTool_ButtonDownFcn(hObject, eventdata, handles), связанной с ButtonDownFcn инструмента и не удаляется с помощью любых других функций. Но щелчок правой кнопкой мыши на инструменте не дает ни сообщения msgbox, ни командного окна.

Я хочу щелкнуть правой кнопкой мыши по кнопке переключения MyTool (настраиваемый инструмент на панели инструментов) для выполнения функции MyTool_ButtonDownFcn. Как мне это сделать?

ответ

0

ButtonDownFcn игнорируется для uitoggletool и uipushtool объектов. Вместо этого вы должны использовать свойство 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 
+0

тумблера Инструмента ' MyTool' имеет действительные функции 'OnCallback' и' OffCallback'. Следовательно, нельзя использовать 'ClickedCallback' для еще одной задачи. С помощью функции «MouseReleasedCallback» функция выполняется как для левой, так и для левой кнопки мыши и для отпуска правой кнопкой мыши. Поэтому нельзя использовать этот обратный вызов, поскольку он мешает левому клику для «OnCallback» и «OffCallback». Спасибо за информацию о 'findjobj', хотя это не решило проблему. Я хотел добавить еще одну функцию к кнопке переключения MyTool. Я думал, что щелчок правой кнопкой является единственным способом. Есть ли еще идея сделать это? – ItzMe

+0

@Govinda Я обновил этот пример, чтобы быть немного более основательным. Вы можете определенно использовать 'OnCallback' и' OffCallback' в сочетании с 'MouseReleasedCallback', вам просто нужно сделать проверку обратного вызова, что она была нажата правой кнопкой. См. Мое обновление. – Suever

+0

Это сработало, пока я не понял, что в функции обратного вызова необходимо обновить 'handle'. У функций обратного вызова есть 'callback (hObject, eventdata, handles)' синтаксис, поэтому я специально не спросил. Но мне нужно, чтобы «ручки» тоже обновлялись внутри обратного вызова. Не могли бы вы помочь мне сделать это тоже? – ItzMe