Установить ограничения для значений в ячейках подходящего - PullRequest
1 голос
/ 27 марта 2020

Я создаю GUI с помощью Matlab's App Designer (2019b). Одна из приятных особенностей NumericEditField заключается в том, что вы можете определять пределы значений, чтобы пользователи не могли вводить значения за пределами желаемого диапазона. Например, следующее будет ограничивать значения поля редактирования от -100 до 100.

app.numericEditField1.Limits = [-100 100];

У меня также есть объект uitable в моем GUI - возможно ли установить предельные значения для ячеек в таблица данных, как с полями редактирования? Я не видел собственность, которая была бы явно эквивалентна. Моя лучшая идея для обходного пути - отредактировать CellEditCallback, чтобы вручную проверять значения при каждом его изменении.

Ниже приведен пример приложения, в котором есть поле редактирования значения с ограничениями и обычное uitable , Я хотел бы также установить пределы значений для определенных столбцов таблицы.

Пример кода

classdef sampleLimitedValApp < matlab.apps.AppBase

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

% Callbacks that handle component events
methods (Access = private)

    % Code that executes after component creation
    function startupFcn(app)
        app.UITable.Data = zeros(3,4);
    end
end

% Component initialization
methods (Access = private)

    % Create UIFigure and components
    function createComponents(app)

        % Create UIFigure and hide until all components are created
        app.UIFigure = uifigure('Visible', 'off');
        app.UIFigure.Position = [100 100 383 331];
        app.UIFigure.Name = 'UI Figure';

        % Create LimitedEditValueEditFieldLabel
        app.LimitedEditValueEditFieldLabel = uilabel(app.UIFigure);
        app.LimitedEditValueEditFieldLabel.HorizontalAlignment = 'right';
        app.LimitedEditValueEditFieldLabel.Position = [31 280 101 22];
        app.LimitedEditValueEditFieldLabel.Text = 'Limited Edit Value';

        % Create LimitedEditValueEditField
        app.LimitedEditValueEditField = uieditfield(app.UIFigure, 'numeric');
        app.LimitedEditValueEditField.Limits = [-100 100];
        app.LimitedEditValueEditField.Position = [147 280 100 22];

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

        % Show the figure after all components are created
        app.UIFigure.Visible = 'on';
    end
end

% App creation and deletion
methods (Access = public)

    % Construct app
    function app = sampleLimitedValApp

        % Create UIFigure and components
        createComponents(app)

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

        % Execute the startup function
        runStartupFcn(app, @startupFcn)

        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

1 Ответ

1 голос
/ 31 марта 2020

Ваша идея использовать CellEditCallback была правильной. Я должен признать, что я на самом деле не являюсь экспертом в создании и использовании классов в Matlab и всегда создаю свои GUI с нуля без использования AppDesigner, поэтому я не знаю, возможно, существует ли лучшая организация функций и методов .

Однако следующее делает то, что вы хотите:

% Component initialization
methods (Access = private)

    % Create UIFigure and components
    function createComponents(app)

        % original code

        % added code
        app.UITable.CellEditCallback = @limitCellVal;
        function limitCellVal(src,evt)
            CellLimits = [-100 100];
            idx = evt.Indices; % indices of selected cell
            belowLowerLimit = src.Data(idx(1),idx(2)) < CellLimits(1);
            aboveUpperLimit = src.Data(idx(1),idx(2)) > CellLimits(2);
            if belowLowerLimit, src.Data(idx(1),idx(2)) = CellLimits(1); end
            if aboveUpperLimit, src.Data(idx(1),idx(2)) = CellLimits(2); end
        end

    end

end

Если вы хотите редактировать несколько ячеек одновременно, тогда необходима небольшая настройка функции обратного вызова, но я думаю, что вы может справиться.

...