Пользовательский интерфейс и графические компоненты имеют определенные свойства, которые можно связать с определенными функциями обратного вызова. Каждое из этих свойств соответствует определенному действию пользователя. Например, uiccontrol имеет свойство, называемое Callback. Можно задать значение этого свойства как дескриптор функции обратного вызова, анонимной функции или символьного вектора, содержащего выражение MATLAB ®. Установка этого свойства заставляет приложение отвечать, когда пользователь взаимодействует с uiccontrol. Если Callback свойство не имеет указанного значения, то при взаимодействии пользователя с uiccontrol ничего не происходит.
В этой таблице перечислены доступные свойства обратного вызова, действия пользователя, запускающие функцию обратного вызова, и наиболее распространенные компоненты пользовательского интерфейса и графики, которые их используют.
Свойство обратного вызова | Действие пользователя | Компоненты, использующие это свойство |
|---|---|---|
ButtonDownFcn | Конечный пользователь нажимает кнопку мыши, пока указатель находится на компоненте или рисунке. | |
Callback | Конечный пользователь запускает компонент. Например, выбор пункта меню, перемещение ползунка или нажатие кнопки. | |
CellEditCallback | Конечный пользователь редактирует значение в таблице, ячейки которой можно редактировать. | |
CellSelectionCallback | Конечный пользователь выбирает ячейки в таблице. | |
ClickedCallback | Пользователь нажимает или переключает инструмент левой кнопкой мыши. | |
CloseRequestFcn | Фигура закрывается. | |
CreateFcn | Обратный вызов выполняется, когда MATLAB создает объект, но до его отображения. |
|
DeleteFcn | Обратный вызов выполняется непосредственно перед тем, как MATLAB удалит рисунок. |
|
KeyPressFcn | Конечный пользователь нажимает клавишу клавиатуры, пока указатель находится на объекте. | |
| Конечный пользователь отпускает клавишу клавиатуры, пока указатель находится на объекте. | |
OffCallback | Выполняется, когда | |
OnCallback | Выполняется, когда | |
| Конечный пользователь изменяет размер группы кнопок, фигуры или панели, | |
SelectionChangedFcn | Конечный пользователь выбирает другой переключатель или переключатель в группе кнопок. | |
WindowButtonDownFcn | Конечный пользователь нажимает кнопку мыши, пока указатель находится в окне рисунка. | |
WindowButtonMotionFcn | Конечный пользователь перемещает указатель в окне рисунка. | |
WindowButtonUpFcn | Конечный пользователь отпускает кнопку мыши. | |
WindowKeyPressFcn | Конечный пользователь нажимает клавишу, пока указатель находится на рисунке или любом из его дочерних объектов. | |
WindowKeyReleaseFcn | Конечный пользователь отпускает клавишу, пока указатель находится на рисунке или любом из его дочерних объектов. | |
| Конечный пользователь поворачивает колесо мыши, пока указатель находится на рисунке. |
Чтобы связать функцию обратного вызова с компонентом пользовательского интерфейса, задайте значение одного из свойств обратного вызова компонента в качестве ссылки на функцию обратного вызова. Обычно это делается при определении компонента, но можно изменить значения свойств обратного вызова в любом месте кода.
Укажите значение свойства обратного вызова одним из следующих способов:
Укажите массив ячеек. Этот массив ячеек содержит дескриптор функции в качестве первого элемента, а также все входные аргументы, которые необходимо использовать в функции.
Укажите вектор символов, содержащий команды MATLAB (не рекомендуется)
Дескрипторы функций обеспечивают способ представления функции как переменной. Функция должна быть локальной или вложенной функцией в том же файле, что и код приложения, или ее можно записать в отдельный файл, находящийся по пути MATLAB.
Чтобы создать дескриптор функции, укажите @ перед именем функции. Например, это uicontrol команда задает Callback свойство должно быть дескриптором функции pushbutton_callback:
b = uicontrol('Style','pushbutton','Callback',@pushbutton_callback);
Вот определение функции для pushbutton_callback:
function pushbutton_callback(src,event) display('Button pressed'); end
| Имя свойства обратного вызова | Компонент |
|---|---|
WindowKeyPressFcnWindowKeyReleaseFcnWindowScrollWheel | figure |
KeyPressFcn | figure, uicontrol, uitable |
KeyReleaseFcn | figure, uicontrol, uitable |
SelectionChangedFcn | uibuttongroup |
CellEditCallbackCellSelectionCallback | uitable |
Преимущество указания обратных вызовов в качестве дескрипторов функций состоит в том, что MATLAB проверяет функцию на наличие синтаксических ошибок и отсутствующих зависимостей при назначении обратного вызова компоненту. Если есть проблема в функции обратного вызова, то MATLAB возвращает ошибку немедленно вместо ожидания, когда пользователь запустит обратный вызов. Такое поведение помогает найти проблемы в коде до того, как пользователь столкнется с ними.
Используйте массив ячеек, чтобы указать функцию обратного вызова, которая принимает дополнительные входные аргументы, которые вы хотите использовать в функции. Первый элемент в массиве ячеек является дескриптором функции. Другими элементами в массиве ячеек являются дополнительные входные аргументы, которые необходимо использовать, разделенные запятыми. Указанная функция должна определять те же два входных аргумента, как описано в разделе Указание дескриптора функции. Однако можно определить дополнительные входные данные в объявлении функции после первых двух аргументов.
Это uicontrol создает кнопку и задает Callback является массивом ячеек. В этом случае именем функции является pushbutton_callback, и значение дополнительного входного аргумента равно 5.
b = uicontrol('Style','pushbutton','Callback',{@pushbutton_callback,5});
Вот определение функции для pushbutton_callback:
function pushbutton_callback(src,event,x) display(x); end
Как и обратные вызовы, указанные как дескрипторы функций, MATLAB проверяет обратные вызовы, указанные как массивы ячеек, на наличие синтаксических ошибок и отсутствующих зависимостей при назначении обратного вызова компоненту. Если есть проблема в функции обратного вызова, то MATLAB возвращает ошибку немедленно вместо ожидания, когда пользователь запустит обратный вызов. Такое поведение помогает найти проблемы в коде до того, как пользователь столкнется с ними.
Укажите анонимную функцию, если требуется, чтобы компонент пользовательского интерфейса выполнял функцию, которая не поддерживает два аргумента, необходимые для дескрипторов функций и массивов ячеек. Например, это uicontrol создает кнопку и задает Callback является анонимной функцией. В этом случае именем функции является myfun, и его объявление функции определяет только один входной аргумент, x.
b = uicontrol('Style','pushbutton','Callback',@(src,event)myfun(x));
Можно указать вектор символов, когда требуется выполнить несколько простых команд, но обратный вызов может стать трудным для управления, если он содержит более нескольких команд. Указанный вектор символов должен состоять из допустимых выражений MATLAB, которые могут включать аргументы для функций. Например:
hb = uicontrol('Style','pushbutton',... 'String','Plot line',... 'Callback','plot(rand(20,3))');
'plot(rand(20,3))', является допустимой командой, и MATLAB оценивает ее, когда пользователь нажимает кнопку. Если символьный вектор включает переменную, например,'plot(x)'x должен существовать в базовой рабочей области, когда пользователь инициирует обратный вызов или возвращает ошибку. Переменная не должна существовать во время назначения значения свойства обратного вызова, но она должна существовать, когда пользователь запускает обратный вызов.В отличие от обратных вызовов, указанных как дескрипторы функций или массивы ячеек, MATLAB не проверяет векторы символов на наличие синтаксических ошибок или отсутствующих зависимостей. Если возникает проблема с выражением MATLAB, оно остается необнаруженным до тех пор, пока пользователь не запустит обратный вызов.