2009-06-08 10 views
3

Mein Problem ist folgendes: Ich habe eine MATLAB-GUI und möchte die Analyseergebnisse erhalten, wenn ich sie in meiner GUI und nicht im Befehlsfenster anzeigen lasse. Ich habe versucht, ein Listenfeld zu verwenden, um die Ergebnisse aufgrund der Schieberegler anzuzeigen, die automatisch für das Listenfeld erstellt werden, aber es hat nicht funktioniert. Wie kann ich die Daten anzeigen, möglicherweise mithilfe eines statischen Textfelds?Anzeige von Analyseergebnissen in einer MATLAB-GUI

Antwort

1

Ich verwende normalerweise nur eine Figur und Text, z.

figure(gcf) 
text(offsetX1, offsetX1, ['result 1: ' num2str(result1)]) 
text(offsetX2, offsetX2, ['result 2: ' num2str(result2)]) 

heute ich bin sicher, es gibt einen besseren Weg, aber es funktioniert gut für mich, obwohl Sie manuell die Layout-Details zu entwerfen haben.

8

Zuerst müssen Sie sicherstellen, dass Sie jede Ausgabe im Befehlsfenster unterdrücken. Sie können dies tun, indem Sie sicherstellen, dass Sie Zeilen mit einem semicolon beenden, vermeiden Sie die Verwendung der DISP-Funktion zum Anzeigen von Daten, und vermeiden Sie die Verwendung der FPRINTF-Funktion, um Daten an die Standardausgabe (d. H. Befehlsfenster) zu senden.

Zweitens, bestimmen Sie, welche Art von "Ergebnissen" Sie anzeigen möchten. Wenn es sich um einen Vektor oder eine Matrix numerischer Werte handelt, können Sie anstelle eines statischen Textfelds ein UITABLE-Objekt verwenden (wie in Azim's answer to your other question vorgeschlagen und vorausgesetzt, Sie haben eine der neueren Versionen von MATLAB). Wenn es nur ein paar numerische Werte, Zeichen oder Zeichenfolgen sind, würde ich vorschlagen, ein statisches Textfeld zu verwenden. Zum Beispiel:

hList = uicontrol('Style','text','Position',[100 100 200 200]); 
set(hList,'String',{'Line 1'; 'Line 2'}); % Displays 2 lines, one string each 
vec = rand(3,1); % Column array of 3 random values 
set(hList,'String',num2str(vec)); % Displays 3 lines, one number per line 

Mit dieser Option werden Sie wahrscheinlich viel mit string operations am Ende tun.

HINWEIS: Mit statischen Textfeldern, wenn Sie mehr Text in sie einfügen, als sie anzeigen können, werden sie einfach den Text abgeschnitten. Sie erstellen nicht automatisch Schieberegler, um den gesamten Text anzuzeigen. Sie müssen entweder die statische Textbox vergrößern, die "FontSize" property des statischen Textfelds auf einen kleineren Wert einstellen, oder (die kompliziertere Option) einen eigenen Schieberegler erstellen, der die Anzeige im Textfeld anpasst.


EDIT: Je komplizierte Option ...

Falls jemand interessiert ist, dachte ich, dass ich ein statisches Textfeld mit einem Schieberegler einig Beispiel-Code enthalten würde für die Herstellung, die die Inhalte steuert im Textfeld angezeigt. Es gibt einige verschiedene Möglichkeiten, dies zu tun, von der einfachsten Implementierung, die ich mir vorstellen kann (siehe unten), bis hin zu komplizierteren Versionen unter Verwendung von nested functions und fancy OOP stuff.

Als erstes müssen Sie die beiden folgenden Funktionen als m-Dateien gespeichert haben müssen:

callback_scrolltext.m

function callback_scrolltext(source,event,hText) 
    textString = get(hText,'UserData'); 
    nLines = numel(textString); 
    lineIndex = nLines-round(get(source,'Value')); 
    set(hText,'String',textString(lineIndex:nLines)); 
end 

update_scrolltext.m

function update_scrolltext(newText,hText,hSlider) 
    newText = textwrap(hText,newText); 
    set(hText,'String',newText,'UserData',newText); 
    nRows = numel(newText); 
    if (nRows < 2), 
    sliderEnable = 'off'; 
    else 
    sliderEnable = 'on'; 
    end 
    nRows = max(nRows-1,1); 
    set(hSlider,'Enable',sliderEnable,'Max',nRows,... 
     'SliderStep',[1 3]./nRows,'Value',nRows); 
end 

Zweite Erstellen Sie die GUI-Objekte mit dem folgenden Code.Sie können die ‚Position‘ Eigenschaften auf, was auch immer Sie, sowie verwenden einen Griff für eine Figur oder Panel-Objekt anstelle von hParent wollen:

hParent = figure; 
hText = uicontrol('Style','text',... 
        'Parent',hParent,... 
        'Units','pixels',... 
        'Position',[100 100 100 40]); 
hSlider = uicontrol('Style','slider',... 
        'Parent',hParent,... 
        'Units','pixels',... 
        'Position',[200 100 10 40],... 
        'Enable','off',... 
        'Callback',{@callback_scrolltext,hText}); 

schließlich jedes Mal, wenn Sie möchten, ändern Sie den Text der das Textfeld, Anruf update_scrolltext mit dem Text, den Sie anzeigen möchten (in einem Zellenarray enthalten, wie die Zeichenfolge TEXTWRAP ist) und die Handles des Textfelds und Schieberegler. Hier sind einige Beispiele zu versuchen:

update_scrolltext({'hello'},hText,hSlider); 
update_scrolltext({'hello'; 'there'; 'silly'; 'world'},hText,hSlider); 

Ändern Sie den Code, wie Sie sehen und genießen Sie es! =)

+0

Können Sie vorschlagen, wie verhindert wird, dass der vorher eingegebene Text verschwindet, wenn ein neuer Aufruf an 'update_scrolltext()' erfolgt? Mit anderen Worten, wie kann ich den obigen Code ändern, um den neuen Text in einer neuen Zeile mit vorherigen Texten darüber anzuzeigen? Vielen Dank. – Pupil

+1

@Pupil Fügen Sie dies am Anfang von 'update_scrollettext' hinzu und es sollte hinzugefügt werden anstatt zu überschreiben:' altText = get (hText, 'UserData'); newText = [altText; newText]; ' – gnovice

+0

Vielen Dank gnovice! – Pupil

2

Ich verwende Listbox, um die Befehlsausgabe ganz gut anzuzeigen. Ich finde, dass die Bildlaufleisten das Betrachten der Ausgabe ohne Unordnung besser machen.

Angenommen, Status ist das Handle zu der uicontrol mit einem Stil der Listbox;

Damit dies funktioniert, denke ich, die erste Zeichenfolge der uicontrol sollte eine Zelle sein, und keine Zeichenfolge. Sie können, indem Sie die Zeichenfolge des uicontrol als ‚Ready‘ auf zwei Zeilen dieses sicher zu gehen, oder Sie können die Zeichenfolge in eine Zelle wie diese zwingen:

set(status,'String', [message; {get(status,'String')}]); 
+0

danke euch allen Jungs, ich werde es versuchen. –

+0

noch eine Sache, wenn Sie die GUI aktualisieren, während der Code ausgeführt wird, sind die Änderungen möglicherweise nicht sofort sichtbar. Verwenden Sie in diesem Fall 'drawnnow', um das Neuzeichnen der GUI zu erzwingen. – ustun

0

ich ab bin nur auf Matlab Gui, also bin ich keineswegs Experte oder gar erfahren - aber jemand hat in einem anderen Forum erwähnt, dass das Edit-Text-Element automatisch Scroll-Balken erzeugt? Es hat auch den zusätzlichen Vorteil, auswählbar und kopierbar zu sein, glaube ich. Ich bin dabei herauszufinden, ob ich meinen Code herausfinden kann. Ich werde zurückschreiben, wenn ich es weiß.

+1

Das stimmt. Ich benutze auch "bearbeiten" uicontrols, wenn ich Bildlaufleisten und auswählbaren Text möchte. – tashuhka

Verwandte Themen