Чтобы создать пользовательский UIs и визуализацию, можно объединить несколько графических объектов и объектов пользовательского интерфейса, изменить их свойства или вызвать дополнительные функции. В R2020a и более ранних релизах, распространенный способ сохранить ваш код индивидуальной настройки и совместно использовать его с другими состоит в том, чтобы записать скрипт или функцию.
Начиная в R2020b, вместо скрипта или функции, можно создать реализацию класса для компонентов пользовательского интерфейса путем определения подкласса ComponentContainer
базовый класс. Создание класса обладает этими преимуществами:
Легкая индивидуальная настройка — Когда пользователи хотят настроить аспект вашего компонента пользовательского интерфейса, они могут установить свойство вместо того, чтобы иметь необходимость изменить и повторно выполнить ваш код. Пользователи могут изменить свойства в командной строке или смотреть их в Property Inspector.
Инкапсуляция — Организация вашего кода таким образом позволяет вам скрывать детали реализации от своих пользователей. Вы реализуете методы, которые выполняют вычисления и управляют базовыми графическими объектами.
Класс компонента пользовательского интерфейса имеет несколько необходимых частей и еще несколько, которые являются дополнительными.
В первой линии класса компонента пользовательского интерфейса задайте matlab.ui.componentcontainer.ComponentContainer
класс как суперкласс. Например, первая линия класса под названием ColorSelector
выглядит так:
classdef ColorSelector < matlab.ui.componentcontainer.ComponentContainer
В дополнение к определению суперкласса включайте следующие компоненты в свое определение класса. Некоторые компоненты требуются, в то время как другие компоненты или рекомендуются или дополнительные.
Компонент | Описание |
---|---|
Блок общественной собственности | Этот блок задает все свойства, к которым у пользователей есть доступ. Вместе, эти свойства составляют пользовательский интерфейс вашего компонента пользовательского интерфейса. |
Блок частной собственности | Этот блок задает базовые графические объекты и другие детали реализации, к которым не могут получить доступ пользователи. В этом блоке, набор эти значения атрибута:
|
Блок Событий | Этот блок задает события, которые инициирует этот компонент пользовательского интерфейса. В этом блоке, набор эти значения атрибута:
Когда вы устанавливаете |
| Этот метод устанавливает начальное состояние компонента пользовательского интерфейса. Это выполняется однажды, когда 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
метод для вашего класса. setup
метод выполняется однажды, когда MATLAB создает объект компонента пользовательского интерфейса. Любые значения свойств, переданные как аргументы пары "имя-значение" методу конструктора, присвоены после того, как этот метод выполняется.
Используйте setup
метод к:
Создайте графические объекты и объекты пользовательского интерфейса, которые составляют компонент.
Храните объекты как частные свойства на объекте компонента.
Разметьте и сконфигурируйте объекты.
Обеспечьте электричеством объекты сделать что-то полезное в компоненте.
Гарантировать, что только ваш класс компонента пользовательского интерфейса может выполнить setup
метод, задайте его в защищенном блоке.
Большинство функций создания объекта пользовательского интерфейса имеет дополнительный входной параметр для определения родительского элемента. Когда вы вызываете эти функции из метода класса, необходимо задать целевой родительский элемент. setup
метод берет один аргумент, который представляет экземпляр настраиваемого объекта компонента пользовательского интерфейса. Используйте этот аргумент, чтобы задать компонент пользовательского интерфейса как целевой родительский элемент при вызывании функции создания объекта из setup
метод.
Например, рассмотрите компонент пользовательского интерфейса, который имеет эти свойства:
Одна общественная собственность под названием Value
Три частных свойств под названием Grid
, Button
, и EditField
setup
вызовы метода uigridlayout
, uieditfield
, и uibutton
функции, чтобы создать базовый графический объект для каждой частной собственности, задавая экземпляр компонента пользовательского интерфейса (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
метод, чтобы реконфигурировать базовые графические объекты в вашем пользовательском интерфейсе, компонентно-ориентированном на новых значениях публичных свойств. Как правило, этот метод не определяет который из измененных публичных свойств. Это реконфигурировало все аспекты базовых графических объектов, которые зависят от публичных свойств.
Например, рассмотрите компонент пользовательского интерфейса, который имеет эти свойства:
Одна общественная собственность под названием 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
Может быть задержка между изменением значений свойств и наблюдением результатов тех изменений. 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
в Командном окне.