1

Ich fragte bereits auf Matlab Answers, aber habe keine Antwort dort, also versuche ich es hier.Right-Align-Werte in UITable in App Designer

Ich habe einige Zahlen, die ich in einem UITable zeigen möchte. Da ich eine spezielle Formatierung der Werte (drei Ziffern nach Komma, keine wissenschaftliche Notation) brauche, habe ich die Werte in Strings umgewandelt. Das Problem ist, dass diese Zeichenfolgen linksbündig sind, was nicht sehr gut aussieht.

Wenn uitable in GUIDE, war ich mit führenden Leerzeichen aufzufüllen Saiten der Lage, wie sie richtig ausgerichtet ist, sich in der folgenden

data = {'1532.000'; ' 5.543'; ' 26.457'}; 

ein Mono-Raum Schriftart verwenden, werden die Werte wie dies in der Tabelle gezeigt :

1532.000 
    5.543 
    26.457 

Momentan überlege ich, zu App Designer zu wechseln. Ich benutze die gleichen Raum-gepolsterten Saiten, aber hier scheint die Eignung sie zu entfernen. Das ist das Ergebnis sieht wie folgt aus:

1532.000 
5.543 
26.457 

Gibt es eine Möglichkeit uitable in App Designer halten die Räume zu machen, wie es in GUIDE tat? Natürlich wäre es sogar besser, die Saiten direkt auszurichten, ohne dass ein Padding erforderlich ist, aber soweit ich weiß, ist dies nicht möglich.

Falls es darauf ankommt: Ich verwende Matlab R2016b.

Edit:

Minimal Beispiel für die Erzeugung und eine uitable füllen. Dies ist eine einfache AppDesigner GUI, wo ich nur eine Tabelle und eine Schaltfläche hinzugefügt habe (ohne irgendwelche Attribute zu ändern). Der Klick-Callback der Schaltfläche dient zum Hinzufügen der Daten zur Tabelle.

classdef test < matlab.apps.AppBase 

    % Properties that correspond to app components 
    properties (Access = public) 
     UIFigure matlab.ui.Figure 
     UITable matlab.ui.control.Table 
     Button matlab.ui.control.Button 
    end 

    methods (Access = private) 

     % Button pushed function: Button 
     function ButtonPushed(app, event) 
      data = {'1532.000'; ' 5.543'; ' 26.457'}; 
      app.UITable.Data = data; 
     end 
    end 

    % App initialization and construction 
    methods (Access = private) 

     % Create UIFigure and components 
     function createComponents(app) 

      % Create UIFigure 
      app.UIFigure = uifigure; 
      app.UIFigure.Position = [100 100 640 480]; 
      app.UIFigure.Name = 'UI Figure'; 
      setAutoResize(app, app.UIFigure, true) 

      % Create UITable 
      app.UITable = uitable(app.UIFigure); 
      app.UITable.ColumnName = {'Column 1'; 'Column 2'; 'Column 3'; 'Column 4'}; 
      app.UITable.RowName = {}; 
      app.UITable.Position = [127 180 302 185]; 

      % Create Button 
      app.Button = uibutton(app.UIFigure, 'push'); 
      app.Button.ButtonPushedFcn = createCallbackFcn(app, @ButtonPushed, true); 
      app.Button.Position = [220 104 100 22]; 
     end 
    end 

    methods (Access = public) 

     % Construct app 
     function app = test() 

      % Create and configure components 
      createComponents(app) 

      % Register the app with App Designer 
      registerApp(app, app.UIFigure) 

      if nargout == 0 
       clear app 
      end 
     end 

     % Code that executes before app deletion 
     function delete(app) 

      % Delete UIFigure when app is deleted 
      delete(app.UIFigure) 
     end 
    end 
end 

Nach Drücken der Taste sieht die Tabelle wie folgt:

enter image description here

Beachten Sie, dass AppDesigner erlaubt nur mir den Code innerhalb der ButtonPushed Funktion zu ändern.

+0

Haben Sie versucht, [diese Lösung] (http://stackoverflow.com/questions/38933254/how-to-customize-app-designer-figures-in-more-ways-than-offici-documented) anzupassen Deine Bedürfnisse? Was du fragst, ist fast identisch, mit dem einzigen Unterschied, dass du nach einer Tabelle fragst und die verknüpfte Frage eine Liste behandelt ... In jedem Fall füge bitte einen minimalen Code hinzu, der die fragliche "Uifigur" erzeugt. –

+0

@ Dev-iL Danke, das sieht wirklich vielversprechend aus. Ich bin mir nicht sicher, ob ich in dieser Woche Zeit dafür haben kann, aber ich werde es tun, wenn ich Zeit dazu habe. Ich melde mich, als ich es versuchte. – luator

+0

@ Dev-iL Ich fand früher als erwartet. Ein minimales Beispiel wird der Frage hinzugefügt. Ich habe auch versucht, aber leider scheint die Tabelle anders gehandhabt zu werden, als wenn ich sie in einem Browser öffne (alle anderen Elemente sind da). – luator

Antwort

3

Nach investigating dies für eine Weile, fand ich, dass der Grund für das "spezielle" Verhalten, wenn es um eine uitable geht, ist, weil es eigentlich ein Java-Objekt ist! (Ich habe keine Ahnung, wie sie das geschafft haben oder warum).In jedem Fall können die Daten der rechten Ausrichtung durch das Einfügen einer Zeile zu Ihrem Skript durchgeführt werden:

data = {'1532.000'; ' 5.543'; ' 26.457'};   
app.UITable.Data = data; 
setColumnFormat(java(app.UITable),{'numeric'}); % < Add this 

, wenn es mehr als eine Spalte, die Sie möchten auf diese Weise nach rechts auszurichten, replizieren einfach {'numeric'} so oft je nach Bedarf:

setColumnFormat(java(app.UITable), repmat({'numeric'}, 1, size(data,2))); 

Es gibt auch eine etwas kürzere möglich Notation für die Styling-Befehle oben (dank @luator für den Hinweis):

app.UITable.ColumnFormat = {'numeric'}; 
app.UITable.ColumnFormat = repmat({'numeric'}, 1, size(data,2)); 

Das Ergebnis:

Demonstration

Wenn ich das richtig verstanden Yair Blog, können Sie weitere Informationen über die Anpassung dieser Tabellenobjekte durch die Suche nach „JIDE Table“ oder SortableTable finden.

+0

Dies stimmt die Daten tatsächlich rechtsbündig ab, während die Zahlenformatierung der Zeichenfolge beibehalten wird (d. H. Drei Dezimalstellen, keine wissenschaftliche Schreibweise). Momentan betrifft Ihr Code nur die erste Spalte (in meiner realen Anwendung gibt es mehrere Spalten), aber ich denke, es sollte einfach sein, sie zu erweitern (ich habe jetzt keine Zeit, aber ich werde Sie wissen lassen, ob ich eine Lösung finde) . – luator

+0

@luator - Ich habe die Lösung erweitert, um mehrere Spalten zu beeinflussen. –

+1

Vielen Dank für Ihre Mühe! Ich konnte Ihren Code ein wenig vereinfachen: 'app.UITable.ColumnFormat = repmat (...);' hat den gleichen Effekt. – luator

Verwandte Themen