2017-02-07 2 views
1

Ich habe ein GUI-Programm in Matlab mit Matlab GUIDE geschrieben. Erstellt ein Werkzeug auf der Symbolleiste und schrieb eine Rechtsklick-Rückruffunktion wie unten gezeigt, aber wenn ich mit der rechten Maustaste auf dieses Werkzeug auf der GUI, gibt es keine Antwort.ButtonDownFcn eines Tools auf Matlab GUIDE-Symbolleiste funktioniert nicht

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

Von Eigenschafteninspektor Wert von ButtonDownFcn ist:

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

Ich habe versucht, einen anderen Knopf mit Callback-Funktion zum Debuggen mit auszuführen ‚Tastatur‘.

function bugfindbutton_ClickedCallback(hObject, eventdata, handles) 
keyboard 

Dies bestätigte die Existenz der Funktion mit ButtonDownFcn des Werkzeugs zugeordnet MyTool_ButtonDownFcn(hObject, eventdata, handles) und wird von allen anderen Funktionen nicht gelöscht. Aber ein Rechtsklick auf das Werkzeug gibt weder die msgbox- noch die Befehlsfensterausgabe.

Ich möchte mit der rechten Maustaste auf "MyTool" Umschaltfläche (ein benutzerdefiniertes Werkzeug auf der Symbolleiste), um MyTool_ButtonDownFcn Funktion auszuführen. Wie kann ich es tun?

Antwort

0

Die ButtonDownFcn wird für Objekte uitoggletool und uipushtool ignoriert. Sie sollten stattdessen die Eigenschaft ClickedCallback verwenden, um einen Rückruf festzulegen. Dieser Callback wird jedoch nur mit einem linken Mausklick ausgeführt und nicht mit einem rechten Mausklick ausgelöst.

Wenn Sie wirklich einen Rückruf zu einem rechten Mausklick binden, dann können Sie den findjobj-Dienstprogramm aus dem Dateiaustausch verwenden, um das zugrunde liegende Java-Objekt zuzugreifen und einem benutzerdefinierten Callback-

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

Das Toggle-Tool Taste 'zuweisen MyTool hat gültige OnCallback- und OffCallback-Funktionen. Daher kann 'ClickedCallback' nicht für eine weitere Aufgabe verwendet werden. Mit 'MouseReleasedCallback' wird die Funktion sowohl für die linke Maustaste als auch für die rechte Maustaste ausgeführt. Daher kann dieser Callback nicht verwendet werden, da er mit Linksklick für "OnCallback" und "OffCallback" interferiert. Danke für Informationen über 'findjobj', obwohl es das Problem nicht gelöst hat. Ich wollte eine weitere Funktion zum 'MyTool'-Schalter hinzufügen. Ich dachte, Rechtsklick ist der einzige Weg. Haben Sie noch eine Idee, das zu tun? – ItzMe

+0

@Govinda Ich habe das Beispiel aktualisiert, um etwas gründlicher zu sein. Sie können auf jeden Fall 'OnCallback' und' OffCallback' in Verbindung mit dem 'MouseReleasedCallback' verwenden, Sie müssen nur den Callback überprüfen, dass es die richtige Schaltfläche war, auf die geklickt wurde. Siehe mein Update. – Suever

+0

Dies funktionierte, bis ich erkannte, dass 'Handles' innerhalb der Callback-Funktion aktualisiert werden müssen. Callback-Funktionen haben 'callback (hObject, eventdata, handles)' -Syntax, also habe ich nicht speziell gefragt. Aber ich brauche auch "Handles", um innerhalb des Callbacks aktualisiert zu werden. Könnten Sie mir bitte helfen, das auch zu tun? – ItzMe

Verwandte Themen