Чтобы расширить пользовательский компонент с помощью визуализаций или виджетов сторонних производителей, создайте класс компонента, который содержит компонент пользовательского интерфейса HTML. Используйте компонент HTML UI для настройки внешнего вида компонента и для взаимодействия с библиотеками сторонних производителей, а также класс компонента для определения свойств компонентов и коллбэков, которые может задать пользователь.
Чтобы создать пользовательский класс компонента пользовательского интерфейса, который использует компонент пользовательского интерфейса HTML, необходимо создать два файла.
Файл класса UI-компонента - В этом файле вы задаете свой класс компонента. Вы задаете его свойства, значения его свойств, события, которые он слушает, и функции обратного вызова, которые он запускает. Его свойства должны включать тот, который будет содержать компонент HTML UI.
Исходный файл HTML - В этом файле вы конфигурируете и обновляете визуальный внешний вид компонента UI, слушаете пользовательские взаимодействия и передаете информацию о том, что взаимодействие произошло в класс компонента UI.
Ваш код должен сообщать изменения значениям свойств и взаимодействиям пользователей через эти два файла.
Поскольку файл класса компонента пользовательского интерфейса задает свойства, которые могут задать пользователи, но исходный файл HTML управляет визуальным стилем компонента, эти два файла должны сообщаться об обновлениях свойств.
В файле класса компонента пользовательского интерфейса сконфигурируйте свойства компонента пользовательского интерфейса. Задайте свойства, которые пользователи могут задать, определив их как общественная собственность в properties
блок. В update
метод вашего класса, храните значения общественной собственности как поля в struct
в Data
свойство компонента пользовательского интерфейса HTML. Это предоставляет исходному файлу HTML доступ к этим значениям свойств.
В исходном файле HTML используйте значения свойств для обновления внешнего вида компонента HTML UI. Для этого в setup
функция внутри <script>
тег, доступ к значениям полей в Data
и использовать их для изменения свойств стиля элементов HTML.
Пользователи определяют функции обратного вызова компонента в MATLAB®, но эти коллбэки часто слушают ответ на действие, выполненное с элементом HTML, заданным в исходном файл. Таким образом, эти два файла также должны сообщаться о пользовательских взаимодействиях.
В файле класса компонента пользовательского интерфейса сначала создайте свойства коллбэка вашего компонента пользовательского интерфейса. Создайте events
блок со HasCallbackProperty
. Когда вы задаете событие в этом блоке, MATLAB создает связанное свойство общего коллбэка для компонента пользовательского интерфейса. Для примера, если вы создаете событие с именем ButtonPushed
, это автоматически создаст общественную собственность для вашего класса с именем ButtonPushedFcn
.
Чтобы выполнить пользовательскую функцию обратного вызова, связанную с пользовательским взаимодействием, ваш код должен сначала распознать, когда произошло пользовательское взаимодействие. В файле класса компонента пользовательского интерфейса предоставьте компоненту пользовательского интерфейса HTML способ сделать это. В setup
метод, установите Data
свойство компонента пользовательского интерфейса HTML для struct
с полем для хранения информации о том, произошло ли взаимодействие. Поскольку файл класса и исходный файл HTML совместно используют это свойство и его значение, исходный файл HTML может обновить значение, чтобы передать статус взаимодействия пользователя классу компонента пользовательского интерфейса. Для этого в исходном файле HTML в setup
функция внутри <script>
тег, создайте прослушиватель событий, который прослушивает взаимодействие с пользователем. Когда прослушиватель обнаружит взаимодействие, обновите Data
свойство компонента HTML UI.
После того, как файл класса компонента пользовательского интерфейса получит информацию о том, что произошло взаимодействие с пользователем, он должен затем инициировать событие, связанное с взаимодействием. Создайте метод класса для этого. В методе класса сначала вызовите встроенный notify
метод, чтобы вызвать событие, которое вы определили. Это выполняет пользовательскую функцию обратного вызова, связанную с событием. Затем установите Data
свойство компонента HTML, чтобы дождаться другого взаимодействия. В setup
метод файла класса UI компонента, установите DataChangedFcn
свойство HTML компонента к определенному вам методу класса. Компонент пользовательского интерфейса HTML выполняет этот метод автоматически каждый раз, когда Data
изменения свойств. Поэтому после обновления исходного файла HTML Data
свойство, чтобы сообщить, что взаимодействие произошло, этот метод выполняет соответствующий коллбэк.
RoundButton
Реализация классаЭтот пример демонстрирует типовую структуру для записи пользовательского класса пользовательского интерфейса, который использует компонент пользовательского интерфейса HTML. Класс создает кнопку с пользовательским закругленным стилем. Он позволяет пользователям задавать цвет кнопки, текст, цвет текста и ответ по клику.
Чтобы определить свой класс компонента пользовательского интерфейса, создайте два файла в одной папке по пути MATLAB:
RoundButton.m
- определение класса компонента
RoundButton.html
- Исходный файл HTML
RoundButton.m
Определение классаRoundButton класс | Обсуждение |
---|---|
classdef RoundButton < matlab.ui.componentcontainer.ComponentContainer | Создайте пользовательский компонент пользовательского интерфейса с именем RoundButton путем определения подкласса matlab.ui.componentcontainer.ComponentContainer класс. |
properties Color {mustBeMember(Color, ... {'white','blue','red','green','yellow'})} = 'white' FontColor {mustBeMember(FontColor, ... {'black','white'})} = 'black' Text (1,:) char = 'Button'; end | Определите Дополнительные сведения об определении свойств см. в разделе Управление свойствами пользовательских компонентов пользовательского интерфейса. |
properties (Access = private, Transient, NonCopyable) HTMLComponent matlab.ui.control.HTML end | Определите |
events (HasCallbackProperty, NotifyAccess = protected) % Generate a ButtonPushedFcn callback property ButtonPushed end | Задайте |
methods (Access=protected) | Создайте methods блок. |
function setup(obj) % Set the initial position of this component obj.Position = [100 100 80 40]; % Create the HTML component obj.HTMLComponent = uihtml(obj); obj.HTMLComponent.Position = [1 1 obj.Position(3:4)]; obj.HTMLComponent.HTMLSource = fullfile(pwd,'RoundButton.html'); obj.HTMLComponent.Data = struct('Clicked',false); obj.HTMLComponent.DataChangedFcn = @(s,e)notifyClick(obj); end | Определите Затем создайте HTML компонента путем вызова
|
function update(obj) % Update the HTML component data obj.HTMLComponent.Data.Color = obj.Color; obj.HTMLComponent.Data.FontColor = obj.FontColor; obj.HTMLComponent.Data.Text = obj.Text; obj.HTMLComponent.Position = [1 1 obj.Position(3:4)]; end | Определите update метод для вашего класса. В рамках метода сохраните значения Color , FontColor , и Text свойства как поля в Data свойство компонента HTML. Это позволяет обновлять атрибуты элемента кнопки HTML и позволяет компоненту HTML прослушивать изменение этих свойств. |
function notifyClick(obj) if obj.HTMLComponent.Data.Clicked obj.HTMLComponent.Data.Clicked = false; drawnow notify(obj,'ButtonPushed'); end end | Определите функцию, которая запускается, когда Data изменения свойств, который называется notifyClick . Функция сначала проверяет, Clicked ли поле данных компонента HTML true . Если это так, функция устанавливает Clicked поле данных для false чтобы дождаться следующего нажатия кнопки. Функция также запускает ButtonPushed событие, которое, в свою очередь, выполняет пользовательскую ButtonPushedFcn свойство. |
end end | Закройте |
RoundButton.html
Определение источникаИсходный код HTML | Обсуждение |
---|---|
<!DOCTYPE html> <html> <head> | Откройте |
<style> html, body { height: 100%; text-align: center; } button { width: 100%; height: 100%; border-radius: 2em; font-size: 1em; cursor: pointer; border: none; } button:focus { outline: 0; } </style> | Определите стиль для HTML содержимого с помощью разметки CSS:
|
<script type="text/javascript"> function setup(htmlComponent) { | Написание setup функция внутри <script> тег для подключения вашего JavaScript® объект, называемый htmlComponent , к компоненту пользовательского интерфейса HTML, созданному в MATLAB. |
htmlComponent.addEventListener("DataChanged", function(event) { buttonElement = document.getElementById("roundButton"); buttonElement.style.backgroundColor = htmlComponent.Data.Color; buttonElement.innerHTML = htmlComponent.Data.Text; buttonElement.style.color = htmlComponent.Data.FontColor; }); | Добавить прослушиватель событий в |
button = document.getElementById("roundButton"); button.addEventListener("click", function(event) { htmlComponent.Data.Clicked = true; htmlComponent.Data = htmlComponent.Data; }); | Добавьте прослушиватель событий к кнопке HTML. Этот прослушиватель событий прослушивает нажатие кнопки на элементе. Когда пользователь нажимает кнопку, функция:
|
} </script> </head> | Закройте setup функции и <script> и <head> теги. |
<body> <button id="roundButton"></button><br/> </body> | Создайте элемент кнопки в теле HTML. |
</html> | Закройте <html> тег. |
После создания и сохранения RoundButton.m
и RoundButton.html
, создайте образец RoundButton
класс в фигуре пользовательского интерфейса.
Задайте Color
, FontColor
, и ButtonPushedFcn
свойства коллбэка как аргументы имя-значение.
fig = uifigure('Position',[200 200 300 300]); btn = RoundButton(fig, ... 'Color','red', ... 'FontColor','white', ... 'ButtonPushedFcn',@(o,e)disp('Clicked'));
Нажмите кнопку. В Командном окне отображаются Clicked
.