2016-04-16 41 views
2

Ich mache eine GUI-Anwendung in Matlab mit GUIDE. Ich habe Achsen, auf denen ich einige Punkte auf einen Druckknopf klicke. Jetzt möchte ich animierte Linie verwenden, um Linien auf denselben Achsen zu zeichnen. Die Datenpunkte, die der animierten Zeile hinzugefügt werden sollen, stammen von einem Ereignis. Also muss ich Datenpunkte in einem Ereignis-Listener hinzufügen. Ich möchte wissen, wie ich das tun kann, weil dieser Event-Listener keinen Zugriff auf die animierte Zeile hat. Folgendes ist der Code bisher.Wie fügt man Datenpunkte in einer animierten Zeile in Matlab gui durch einen Ereignis-Listener hinzu?

Diese Funktion wird aufgerufen, wenn der Druckknopf clicked- ist

function startButton_Callback(~, ~, handles) 
    x = randi(100, 20); 
    y = randi(100, 20); 
    plot(x, y, 'o'); 
    la = newClass; 
    addlistener(la,'statusAnnouncement',@StatusListener); 

Dies ist die Funktion auf Ereignis

function StatusListener(obj, eventData) 
    h = animatedline; 
    addpoints(h,eventData.coordinate(1),eventData.coordinate(2)); 
    drawnow 

Punkte aufgetragen Grundstück mit aufgerufen wird nur gezeigt werden. Wie zeige ich die animierte Linie? Ich bekomme auch keinen Fehler im Befehlsfenster.

Antwort

0

Es gibt mehrere Möglichkeiten, wie Sie dem Listener Zugriff auf das Objekt animtedline geben können.

  1. Sie StatusListener als an die Callback-Funktion über die anonyme Funktion Unterfunktion von startButton_Callback

    function startButton_Callback(~, ~, handles) 
    
        h = animatedline; 
    
        la = newClass; 
        addlistener(la,'statusAnnouncement',@StatusListener); 
    
        %// This as a subfunction so it can "see" h 
        function StatusListener(src, evnt) 
         h.addpoints(evnt.coordinate(1), evnt.coordinate(2)); 
        end 
    end 
    
  2. Übergeben Sie das animtedline Objekt definieren

    function startButton_Callback(~, ~, handles) 
        h = animatedline; 
    
        la = newClass; 
    
        %// Use the callback but add h as an additional input argument 
        addlistener(la, 'statusAnnouncement', @(s,e)StatusListener(s,e,h)) 
    end 
    
    %// Note the additional input argument here 
    function StatusListener(obj, evnt, h) 
        h.addpoints(evnt.coordinate(1), evnt.coordinate(2)) 
    end 
    
  3. Aktualisieren der animatedlineinnerhalb der anonymen Funktion

    function startButton_Callback(~, ~, handles) 
        h = animatedline; 
    
        la = newClass; 
    
        %// Don't define a separate function and just do the update here 
        addlistener(la, 'statusAnnouncement', @(s,e)h.addpoints(e.coordinate(1), e.coordinate(2))) 
    end 
    
  4. Shop das animatedline Objekt im guidata von appdata Ihrer Figur.

    function startButton_Callback(~, ~, handles) 
    
        h = animatedline; 
    
        %// Store the handle within the appdata of the figure 
        setappdata(gcbf, 'MyAnimatedLine', h) 
    
        la = newClass; 
        addlistener(la,'statusAnnouncement',@StatusListener); 
    end 
    
    function StatusListener(obj, evnt) 
        %// Get the handle from the appdata of the figure 
        h = getappdata(gcbf, 'MyAnimatedLine'); 
        h.addpoints(evnt.coordinate(1), evnt.coordinate(2)) 
    end 
    
+0

Thank you very much. Das hat mein Problem gelöst. Ich habe jedoch eine Frage, in der 4. Weise, was 'gcbf' in' setappdata' ist. Ist es in allen Funktionen global verfügbar? –

+0

@PratikSinghal ['gcbf'] (http://www.mathworks.com/help/matlab/ref/gcbf.html) ist das Handle zu der Figur, die das Objekt enthält, dessen Callback ausgelöst wurde. Es ist ähnlich wie "GCF", aber robuster. Es ist jedoch nur gültig, wenn Sie auf einen Rückruf antworten. – Suever