Установите ограничения для значений в ячейках используемого

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

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

У меня также есть объект uitable в моем графическом интерфейсе — можно ли установить пределы значений для ячеек в таблице данных, например, с полями редактирования? Я не видел свойства, которое было бы явно эквивалентным. Моя лучшая мысль для обходного пути - отредактировать 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

person David K    schedule 27.03.2020    source источник
comment
Пожалуйста, предоставьте минимальный рабочий пример.   -  person thewaywewalk    schedule 28.03.2020
comment
@thewaywewalk Я добавил немного кода. Я не уверен, какой рабочий пример подойдет, когда я даже не знаю, возможно ли что-то.   -  person David K    schedule 30.03.2020
comment
@thewaywewalk Спасибо за ссылки. Я собрал быстрый образец с полем значений с желаемой функциональностью и uitable, к которому я хочу применить это.   -  person David K    schedule 30.03.2020
comment
Есть с чем работать ;)   -  person thewaywewalk    schedule 31.03.2020


Ответы (1)


Ваша идея использовать CellEditCallback была правильной. Я должен признать, что на самом деле я не являюсь экспертом в создании и использовании классов в Matlab и всегда создаю свои графические интерфейсы с нуля, не используя 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

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

person thewaywewalk    schedule 31.03.2020
comment
Отлично, это как раз то, что я искал. Спасибо, что остаётесь со мной! - person David K; 31.03.2020