2017-02-07 65 views
1

我已經使用Matlab GUIDE在Matlab中編寫了一個GUI程序。 在工具欄上創建了一個工具,並編寫了如下所示的右鍵單擊回調函數,但是當我在GUI上右鍵單擊該工具時,沒有響應。Matlab GUIDE工具條上的工具的ButtonDownFcn不起作用

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功能。我該怎麼做?

回答

0

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 
+0

切換工具按鈕' MyTool'具有有效的'OnCallback'和'OffCallback'功能。因此不能將'ClickedCallback'用於一個更多的任務。通過'MouseReleasedCallback',函數對兩者都執行,左鍵單擊釋放和右鍵單擊釋放。所以不能使用這個回調,因爲它會干擾'OnCallback'和'OffCallback'的左鍵單擊。感謝有關'findjobj'的信息,儘管它沒有解決問題。我想添加一個更多的功能到'MyTool'切換按鈕。我認爲右鍵單擊是唯一的方法。有更多的想法做到這一點? – ItzMe

+0

@Govinda我已經更新了示例,使其更加透徹。你可以肯定地使用'OnCallback'和'OffCallback'與'MouseReleasedCallback'結合使用,你只需要進行回調檢查它是被點擊的正確按鈕。查看我的更新。 – Suever

+0

這個工作,直到我意識到'handle'需要在回調函數內更新。回調函數具有'回調(hObject,eventdata,句柄)'語法,所以我沒有具體問。但是我也需要'handle'來在回調中更新。你能幫我做到嗎? – ItzMe