Выравнивание по правому краю значений в UITable в App Designer

Я уже спрашивал об этом на странице Matlab Answers, но не получил там ответа, поэтому попробую здесь.

У меня есть несколько чисел, которые я хочу показать в UITable. Поскольку мне нужно определенное форматирование значений (три цифры после запятой, без научного обозначения), я преобразовал значения в строки. Проблема в том, что эти строки по умолчанию выровнены по левому краю, что выглядит не очень красиво.

При использовании UITable в GUIDE я смог дополнить строки начальными пробелами, чтобы правильно их выровнять, как показано ниже.

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

При использовании моноширинного шрифта значения отображаются в таблице следующим образом:

1532.000
   5.543
  26.457

В настоящее время я рассматриваю возможность перехода на App Designer. Я использую те же строки с пробелами, но здесь uitable, похоже, их лишает. То есть результат выглядит следующим образом:

1532.000
5.543
26.457

Есть ли способ заставить uitable в App Designer сохранять пробелы, как это было в GUIDE? Конечно, было бы еще лучше напрямую выровнять строки по правому краю без заполнения, но, насколько я знаю, это невозможно.

Если это имеет значение: я использую Matlab R2016b.

Изменить:

Минимальный пример создания и заполнения UITable. Это простой графический интерфейс AppDesigner, в который я добавил только таблицу и кнопку (без изменения каких-либо атрибутов). Обратный вызов кнопки используется для добавления данных в таблицу.

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

После нажатия кнопки таблица выглядит следующим образом:

введите здесь описание изображения

Обратите внимание, что AppDesigner позволяет мне изменять код только внутри функции ButtonPushed.


person luator    schedule 14.02.2017    source источник
comment
Вы пытались адаптировать это решение для ваших нужд? То, что вы просите, почти идентично, с той лишь разницей, что вы спрашиваете о таблице, а связанный вопрос касается списка... В любом случае добавьте минимальный код, который генерирует рассматриваемый uifigure.   -  person Dev-iL    schedule 08.03.2017
comment
@Dev-iL Спасибо, это выглядит многообещающе. Я не уверен, смогу ли я потратить время на это на этой неделе, но я сделаю это, как только у меня будет время. Я сообщаю, когда я попробовал это.   -  person luator    schedule 08.03.2017
comment
@Dev-iL Я нашел время раньше, чем ожидал. К вопросу добавлен минимальный пример. Я также попробовал вашу попытку, но, к сожалению, таблица, похоже, обрабатывается по-другому, поскольку ее нет, когда я открываю ее в браузере (все остальные элементы есть).   -  person luator    schedule 09.03.2017


Ответы (1)


После исследования я обнаружил, что причина "особого" поведения, когда приходит к uitable, потому что на самом деле это объект Java! (Я понятия не имею, как им удалось это осуществить и почему). В любом случае, выравнивание данных по правому краю можно выполнить, вставив в скрипт одну строку:

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

если есть несколько столбцов, которые вы хотели бы выровнять по правому краю таким образом, просто реплицируйте {'numeric'} столько раз, сколько необходимо:

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

Также возможна немного более короткая нотация для приведенных выше команд стиля (спасибо @luator за указание на это):

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

Результат:

Демонстрация

Если я правильно понял блог Яира, вы можете найти дополнительную информацию о настройке этих табличных объектов, выполнив поиск «Таблица JIDE» или SortableTable.

person Dev-iL    schedule 09.03.2017
comment
Это действительно выравнивает данные по правому краю, сохраняя числовое форматирование строки (т. е. три десятичных разряда, без экспоненциальной записи). Прямо сейчас ваш код влияет только на первый столбец (в моем реальном приложении есть несколько столбцов), но я думаю, его будет легко расширить (опять же, сейчас у меня нет времени, но я дам вам знать, если найду решение) . - person luator; 10.03.2017
comment
@luator - я расширил решение, чтобы оно затрагивало несколько столбцов. - person Dev-iL; 12.03.2017
comment
Большое спасибо за ваши усилия! Я смог немного упростить ваш код: app.UITable.ColumnFormat = repmat(...); имеет тот же эффект. - person luator; 17.03.2017
comment
Итак, вы... убрали звонок java()? Хорошо... :) .. и добро пожаловать! - person Dev-iL; 17.03.2017
comment
Да видимо и не нужно. - person luator; 17.03.2017