Чтобы создать пользовательские интерфейсы и визуализацию, можно объединить несколько графических объектов и объектов пользовательского интерфейса, изменить их свойства или вызвать дополнительные функции. В R2020a и более ранних релизах распространенным способом хранения кода индивидуальной настройки и обмена им с другими является написание скрипта или функции.
Начиная с R2020b, вместо скрипта или функции можно создать реализацию класса для компонентов пользовательского интерфейса путем определения подкласса ComponentContainer
базовый класс. Создание класса имеет следующие преимущества:
Простая индивидуальная настройка - когда пользователи хотят настроить аспект вашего компонента пользовательского интерфейса, они могут задать свойство, а не изменять и перезапускать ваш код. Пользователи могут изменять свойства в командной строке или просматривать их в Property Inspector.
Инкапсуляция - Организация кода таким образом позволяет вам скрывать детали реализации от пользователей. Вы реализуете методы, которые выполняют вычисления и управляете базовыми графическими объектами.
Класс компонента пользовательского интерфейса имеет несколько необходимых деталей и еще несколько необязательных.
В первой линии класса компонента пользовательского интерфейса задайте matlab.ui.componentcontainer.ComponentContainer
класс как суперкласс. Например, первая линия класса под названием ColorSelector
выглядит следующим образом:
classdef ColorSelector < matlab.ui.componentcontainer.ComponentContainer
В дополнение к указанию суперкласса включите следующие компоненты в определение класса. Некоторые компоненты требуются, в то время как другие являются рекомендуемыми или необязательными.
Компонент | Описание |
---|---|
Блок общественной собственности | Этот блок определяет все свойства, к которым имеют доступ пользователи. Вместе эти свойства составляют пользовательский интерфейс вашего компонента пользовательского интерфейса. |
Блок частной собственности | Этот блок определяет базовые графические объекты и другие детали реализации, к которым пользователи не могут получить доступ. В этом блоке установите следующие значения атрибутов:
|
Блок событий | Этот блок определяет события, которые будет вызывать этот компонент пользовательского интерфейса. В этом блоке установите следующие значения атрибутов:
Когда вы устанавливаете |
| Этот метод устанавливает начальное состояние компонента UI. Он выполняется один раз, когда MATLAB создает объект. Определите этот метод в защищенном блоке, чтобы его мог выполнять только ваш класс. |
| Этот метод обновляет базовые объекты в компоненте пользовательского интерфейса. Он выполняется при следующих условиях:
Определите этот метод в том же защищенном блоке, что и |
Вы не должны писать метод конструктора для вашего класса, потому что он наследует метод от ComponentContainer
базовый класс. Унаследованный конструктор принимает необязательные входные параметры: родительский контейнер и любое количество аргументов пары "имя-значение" для настройки свойств в компоненте пользовательского интерфейса. Для примера, если вы задаете класс, называемый ColorSelector
который имеет общественную собственность Value
и ValueChangedFcn
, можно создать образец своего класса с помощью этого кода:
f = uifigure; c = ColorSelector(f,'Value',[1 1 0],'ValueChangedFcn',@(o,e)disp('Changed'))
Если вы хотите предоставить конструктор, который имеет другой синтаксис или другое поведение, можно задать пользовательский метод конструктора. Пример пользовательского конструктора см. в разделе Запись конструкторов для классов График.
Разделите свойства вашего класса как минимум между двумя блоками:
Общедоступный блок для хранения компонентов пользовательского интерфейса
Частный блок для хранения деталей реализации, которые вы хотите скрыть
Свойства, которые находятся в общем блоке, сохраняют входные значения, предоставленные пользователем. Для примера компонент пользовательского интерфейса, который позволяет пользователю выбрать значение цвета, может хранить значение цвета в общественной собственности. Поскольку аргументы пары "имя-значение" свойства являются необязательными входами в неявный метод конструктора, рекомендуемый подход состоит в том, чтобы инициализировать общественную собственность до значений по умолчанию.
Свойства, которые находятся в частном блоке, хранят базовые графические объекты, составляющие ваш компонент пользовательского интерфейса, в дополнение к любым вычисленным значениям, которые вы хотите хранить. В конечном счете, ваш класс будет использовать данные в общественную собственность, чтобы сконфигурировать базовые объекты. Установите Transient
и NonCopyable
атрибуты для частного блока, чтобы избежать хранения избыточной информации, если пользователь копирует или сохраняет образец компонента пользовательского интерфейса.
Например, вот блоки свойств для компонента пользовательского интерфейса, который позволяет пользователю выбрать значение цвета. Блок общественной собственности хранит значение, которым пользователь может управлять: значение цвета. Блок частной собственности хранит диспетчер размещений сетки, кнопку и редактировать объекты поля.
properties Value {validateattributes(Value, ... {'double'},{'<=',1,'>=',0,'size',[1 3]})} = [1 0 0]; end properties(Access = private,Transient,NonCopyable) Grid matlab.ui.container.GridLayout Button matlab.ui.control.Button EditField matlab.ui.control.EditField end
Вы опционально можете добавить третий блок для событий, которые запускает компонент пользовательского интерфейса.
Создайте общественную собственность для каждого события в блоке путем определения HasCallbackProperty
атрибут. Общественная собственность сохраняет предоставленный пользователем коллбэк, чтобы выполнить его при возникновении события. Имя общественной собственности - это имя события, к которому добавлены буквы Fcn
. Например, компонент пользовательского интерфейса, который позволяет пользователю выбрать значение цвета, может задать событие ValueChanged
, который генерирует соответствующую общественную собственность ValueChangedFcn
. Используйте notify
метод для запуска события и выполнения коллбэка в свойстве.
Например, вот блок событий для компонента пользовательского интерфейса, который позволяет пользователю выбрать значение цвета.
events (HasCallbackProperty, NotifyAccess = protected) ValueChanged end
notify
метод для запуска ValueChanged
событие и выполните коллбэк в ValueChangedFcn
свойство.function getColorFromUser(obj) c = uisetcolor(obj.Value); if (isscalar(c) && (c == 0)) return; end % Update the Value property oldValue = obj.Value; obj.Value = c; % Execute user callbacks and listeners notify(obj,'ValueChanged'); end
f = uifigure; c = ColorSelector(f,'ValueChangedFcn',@(o,e)disp('Changed'))
Задайте setup
метод для вашего класса. A setup
метод выполняется один раз, когда MATLAB создает объект компонента пользовательского интерфейса. Любые значения свойств, переданные в качестве аргументов пары "имя-значение" в метод конструктора, назначаются после выполнения этого метода.
Используйте setup
метод для:
Создайте графические объекты и объекты пользовательского интерфейса, входящие в состав компонента.
Сохраните объекты как частная собственность на объекте компонента.
Раскладывайте и конфигурируйте объекты.
Подключите объекты, чтобы сделать что-то полезное в компоненте.
Чтобы убедиться, что только ваш класс компонента пользовательского интерфейса может выполнять setup
метод, задайте его в защищенном блоке.
Большинство функций создания объектов пользовательского интерфейса имеют необязательный входной параметр для определения родительского элемента. При вызове этих функций из метода класса необходимо задать целевой родительский элемент. The setup
метод принимает один аргумент, который представляет образец настраиваемого объекта компонента пользовательского интерфейса. Используйте этот аргумент, чтобы задать компонент UI в качестве целевого родительского элемента при вызове функции создания объектов из setup
способ.
Например, рассмотрим компонент UI, который имеет следующие свойства:
Одна общественная собственность называется Value
Три частной собственности, называемые Grid
, Button
, и EditField
The setup
метод вызывает uigridlayout
, uieditfield
, и uibutton
функции для создания базового графического объекта для каждой частной собственности, задающие образец компонента UI (obj
) как целевой родительский элемент.
function setup(obj) % Create grid layout to manage building blocks obj.Grid = uigridlayout(obj,[1 2],'ColumnWidth',{'1x',22},... 'RowHeight',{'fit'},'ColumnSpacing',2,'Padding',2); % Create edit field for entering color value obj.EditField = uieditfield(obj.Grid,'Editable',false,... 'HorizontalAlignment','center'); % Create button to confirm color change obj.Button = uibutton(obj.Grid,'Text',char(9998), ... 'ButtonPushedFcn',@(o,e) obj.getColorFromUser()); end
Задайте update
метод для вашего класса. Этот метод выполняется, когда вашему объекту компонента пользовательского интерфейса необходимо изменить его внешний вид в ответ на изменение значений.
Используйте update
метод для перенастройки базовых графических объектов в компоненте пользовательского интерфейса на основе новых значений общественной собственности. Как правило, этот метод не определяет, какой из общественной собственности изменился. Он перенастраивает все аспекты базовых графических объектов, которые зависят от общественной собственности.
Например, рассмотрим компонент UI, который имеет следующие свойства:
Одна общественная собственность называется Value
Три частной собственности, называемые Grid
, Button
, и EditField
update
метод обновляет BackgroundColor
от EditField
и Button
объекты с цветом, сохраненным в Value
. update
метод также обновляет EditField
объект с числовым представлением цвета. Однако таким образом Value
изменяется, изменение становится одинаково заметным везде.
function update(obj) % Update edit field and button colors set([obj.EditField obj.Button],'BackgroundColor',obj.Value, ... 'FontColor',obj.getContrastingColor(obj.Value)); % Update edit field display text obj.EditField.Value = num2str(obj.Value,'%0.2g '); end
Может возникнуть задержка между изменением значений свойств и наблюдением результатов этих изменений. The update
метод запускается впервые после setup
метод запускается, а затем запускается каждый раз drawnow
выполняет. drawnow
функция выполняется автоматически периодически, на основе состояния графического окружения в сеансе работы с MATLAB пользователя. Это периодическое выполнение может привести к потенциальной задержке.
В этом примере показано, как создать компонент пользовательского интерфейса для выбора цвета, используя код, обсуждаемый в других разделах этой страницы. Создайте файл определения класса с именем ColorSelectorComponent.m
в папке, расположенной в пути MATLAB. Определите класс путем выполнения следующих шагов.
Шаг | Реализация |
---|---|
Вывод из |
classdef ColorSelector < matlab.ui.componentcontainer.ComponentContainer |
Задайте общественную собственность. |
properties Value {validateattributes(Value, ... {'double'},{'<=',1,'>=',0,'size',[1 3]})} = [1 0 0]; end |
Определение публичных мероприятий. |
events (HasCallbackProperty, NotifyAccess = protected) ValueChanged % ValueChangedFcn will be the generated callback property end |
Задайте частную собственность. |
properties (Access = private, Transient, NonCopyable) Grid matlab.ui.container.GridLayout Button matlab.ui.control.Button EditField matlab.ui.control.EditField end |
Реализуйте Задайте |
methods (Access = protected) function setup(obj) % Grid layout to manage building blocks obj.Grid = uigridlayout(obj,[1,2],'ColumnWidth',{'1x',22}, ... 'RowHeight',{'fit'},'ColumnSpacing',2,'Padding',2); % Edit field for value display and button to launch uisetcolor obj.EditField = uieditfield(obj.Grid,'Editable',false, ... 'HorizontalAlignment','center'); obj.Button = uibutton(obj.Grid,'Text',char(9998), ... 'ButtonPushedFcn',@(o,e) obj.getColorFromUser()); end |
Реализуйте |
function update(obj) % Update edit field and button colors set([obj.EditField obj.Button],'BackgroundColor',obj.Value, ... 'FontColor',obj.getContrastingColor(obj.Value)); % Update the display text obj.EditField.Value = num2str(obj.Value,'%0.2g '); end end |
Проводите коллбэки и другие части вместе с помощью частных методов. Когда Когда |
methods (Access = private) function getColorFromUser(obj) c = uisetcolor(obj.Value); if (isscalar(c) && (c == 0)) return; end % Update the Value property obj.Value = c; % Execute user callbacks and listeners notify(obj,'ValueChanged'); end function contrastColor = getContrastingColor(~,color) % Calculate opposite color c = color * 255; contrastColor = [1 1 1]; if (c(1)*.299 + c(2)*.587 + c(3)*.114) > 186 contrastColor = [0 0 0]; end end end end |
Затем создайте образец компонента пользовательского интерфейса путем вызова неявного метода конструктора с несколькими общественной собственностью. Задайте коллбэк, чтобы отобразить слова Color changed
при изменении значения цвета.
h = ColorSelector('Value', [1 1 0]); h.ValueChangedFcn = @(o,e) disp('Color changed');
Нажмите кнопку и выберите цвет с помощью палитры цветов. Компонент изменяет внешний вид, и MATLAB отображает слова Color changed
в Командном окне.