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
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.
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! =)
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')}]);
danke euch allen Jungs, ich werde es versuchen. –
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
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ß.
Das stimmt. Ich benutze auch "bearbeiten" uicontrols, wenn ich Bildlaufleisten und auswählbaren Text möchte. – tashuhka
- 1. Anzeige von Daten in einer Listenansicht von einer mysql db
- 2. Anzeige von Daten von einer seriellen Schnittstelle in einer jTabelle
- 3. Anzeige verschiedener Bilder von einer Aktion in einer JSP
- 4. Anzeige ein Bild - Last von einer Reihe
- 5. Anzeige von Attributen einer has_many durch Verbindung
- 6. Zusammenfalten einer leeren Anzeige
- 7. Anzeige von Schwungkomponenten mit einer Schleife
- 8. Anzeige von Funktionstypen in Haskell
- 9. Anzeige einen VisualBrush von einer versteckten Steuer
- 10. Anzeige von Symbol in Silverlight
- 11. Anzeige einer Nummer in Worten in SSRS
- 12. Auffüllen einer numerischen Anzeige in WPF
- 13. Anzeige von Elementen aus einer Datenbank in einem JavaFX TableView
- 14. Anzeige von JSON-Daten in einer Phoenix-Vorlage
- 15. Konvertieren von BackgroundWorker in Task.Run mit einer Modal-Anzeige
- 16. Anzeige eines Arrays von einer anderen Methode in Java
- 17. Anzeige vs Suche vs Sortieren von Strings in einer Datenbank
- 18. Anzeige von Daten mit Oci_fetch_array in einer HTML-Tabelle
- 19. mysql: Anzeige von zwei Zeilen in einer einzigen Zeile
- 20. Anzeige der Tabellennamen in einer Select-Anweisung anstelle von IDs
- 21. Anzeige von Excel-Daten in einer JSP-Seite
- 22. SQL-Server-Funktion zur Anzeige von Wortfrequenz in einer Spalte
- 23. Erstellen einer dynamischen Anzahl von Arrays zur Anzeige in Highchart
- 24. Anzeige von Marker-Daten aus einer Edf-Datei in MatLab
- 25. Anzeige DataTable in einer einfachen GUI C#
- 26. Anzeige aller Zeilen in einer Berechnung?
- 27. Anzeige von farbenblind Bildern
- 28. Anpassen von Arraylist-Anzeige im Anzeige-Tag
- 29. Anzeige von Säulendaten mit CSS-Anzeige Tabellenspalte
- 30. Animieren der Anzeige einer Ansicht
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
@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
Vielen Dank gnovice! – Pupil