特定组件的回调
注意
在以后的版本中将会删除 GUIDE 环境。在删除 GUIDE 后,使用 GUIDE 创建的现有 App 可以继续在 MATLAB® 中运行,但不能在 GUIDE 中对其进行编辑。
要继续编辑使用 GUIDE 创建的现有 App,请参阅 GUIDE 迁移策略,了解有关如何帮助保持该 App 与未来 MATLAB 版本的兼容性的信息。要以交互方式创建新 App,请改用使用 App 设计工具开发 App。
为 UI 组件的行为编写代码会涉及一些特定任务,这些任务对于您正在使用的组件类型而言是唯一的。本主题包含了每种组件类型对应的简单回调示例。有关为回调编写代码的一般信息,请参阅在 GUIDE 中编写回调或Create Callbacks for Apps Created Programmatically。
如何使用示例代码
如果正在 GUIDE 中工作,则右键点击布局中的组件,然后从查看回调菜单中选择相应的回调属性。这将创建一个自动与该组件关联的空回调函数。GUIDE 所创建的特定函数名称是基于组件的 Tag
属性的,因此您的函数名称可能与示例代码中的函数名称略有不同。不要更改 GUIDE 在代码中创建的函数名称。要使用 App 中的示例代码,请将代码从示例的函数体复制到您的函数体。
普通按钮
以下代码是 GUIDE 中的普通按钮回调函数示例。将此函数与普通按钮的 Callback
属性关联,使其在最终用户点击普通按钮时执行。
function pushbutton1_Callback(hObject, eventdata, handles) % hObject handle to pushbutton1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) display('Goodbye'); close(gcf);
第一行代码 display('Goodbye')
将在命令行窗口中显示 'Goodbye'
。下一行使用 gcf
获取 UI 窗口,然后将其关闭。
切换按钮
以下代码是 GUIDE 中的切换按钮回调函数示例。将此函数与切换按钮的 Callback
属性关联,使其在最终用户点击切换按钮时执行。
function togglebutton1_Callback(hObject,eventdata,handles) % hObject handle to togglebutton1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % Hint: get(hObject,'Value') returns toggle state of togglebutton1 button_state = get(hObject,'Value'); if button_state == get(hObject,'Max') display('down'); elseif button_state == get(hObject,'Min') display('up'); end
当切换按钮弹起时,切换按钮的 Value
属性将与 Min
属性匹配。当切换按钮按下时,Value
将更改为 Max
值。此回调函数获取切换按钮的 Value
属性,然后将其与 Max
和 Min
属性进行比较。如果按钮处于按下状态,则函数将在命令行窗口中显示 'down'
。如果按钮处于弹起状态,则函数将显示 'up'
。
单选按钮
以下代码是 GUIDE 中的单选按钮回调函数示例。将此函数与单选按钮的 Callback
属性关联,使其在最终用户点击单选按钮时执行。
function radiobutton1_Callback(hObject, eventdata, handles) % hObject handle to radiobutton1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % Hint: get(hObject,'Value') returns toggle state of radiobutton1 if (get(hObject,'Value') == get(hObject,'Max')) display('Selected'); else display('Not selected'); end
当单选按钮未被选中时,单选按钮的 Value
属性将与 Min
属性匹配。当单选按钮被选中时,Value
将更改为 Max
值。此回调函数将获取单选按钮的 Value
属性,然后将其与 Max
和 Min
属性进行比较。如果按钮被选中,则函数将在命令行窗口中显示 'Selected'
。如果按钮未被选中,则函数将显示 'Not selected'
。
注意
请使用按钮组来管理单选按钮的互斥选择行为。有关详细信息,请参阅按钮组。
复选框
以下代码是 GUIDE 中的复选框回调函数示例。将此函数与复选框的 Callback
属性关联,使其在最终用户点击复选框时执行。
function checkbox1_Callback(hObject, eventdata, handles) % hObject handle to checkbox1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % Hint: get(hObject,'Value') returns toggle state of checkbox1 if (get(hObject,'Value') == get(hObject,'Max')) display('Selected'); else display('Not selected'); end
当复选框未被选中时,复选框的 Value
属性将与 Min
属性匹配。当复选框被选中时,Value
将更改为 Max
值。此回调函数将获取复选框的 Value
属性,然后将其与 Max
和 Min
属性进行比较。如果复选框被选中,则函数将在命令行窗口中显示 'Selected'
。如果复选框未被选中,则函数将显示 'Not selected'
。
编辑文本字段
以下代码是 GUIDE 中的编辑文本字段回调示例。将此函数与 uicontrol 的 Callback
属性关联,使其在最终用户于文本字段内键入内容时执行。
function edit1_Callback(hObject, eventdata, handles) % hObject handle to edit1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % Hints: get(hObject,'String') returns contents of edit1 as text % str2double(get(hObject,'String')) returns contents as double input = get(hObject,'String'); display(input);
用户在文本字段内键入字符并按下 Enter 键后,回调函数将检索这些字符,并在命令行窗口中显示它们。
要允许用户输入多行文本,请将 Max
和 Min
属性设为满足 Max - Min > 1
的数值。例如,将 Max
设为 2
并将 Min
设为 0
可满足该不等式。这种情况下,当最终用户点击 UI 中该文本字段以外的区域时,即会触发回调函数。
检索数值
如果要将编辑文本字段的内容转换为数值,请使用 str2double
函数将字符转换为数值。对于非数值输入,str2double
函数将返回 NaN
。
以下代码是将用户的输入转换为数值的编辑文本字段回调函数示例。
function edit1_Callback(hObject, eventdata, handles) % hObject handle to edit1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % Hints: get(hObject,'String') returns contents of edit1 as text % str2double(get(hObject,'String')) returns contents as a double input = str2double(get(hObject,'String')); if isnan(input) errordlg('You must enter a numeric value','Invalid Input','modal') uicontrol(hObject) return else display(input); end
最终用户在编辑文本字段中输入值并按 Enter 键后,回调函数将获取 String
属性的值,并将其转换为数值。然后,它会查看该值是否为 NaN
(非数值)。如果输入为 NaN
,则回调会显示错误对话框。
滑块
以下代码是 GUIDE 中的滑块回调函数示例。将此函数与滑块的 Callback
属性关联,使其在最终用户移动滑块时执行。
function slider1_Callback(hObject, eventdata, handles) % hObject handle to slider1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % Hints: get(hObject,'Value') returns position of slider % get(hObject,'Min') and get(hObject,'Max') to determine... slider_value = get(hObject,'Value'); display(slider_value);
当最终用户移动滑块时,回调函数将会获取滑块的当前值,并在命令行窗口中显示。默认情况下,滑块的范围为 [0, 1]。要修改范围,请将滑块的 Max
和 Min
属性分别设为最大值和最小值。
列表框
填充列表框中的项
如果您正在使用 GUIDE 开发 App,则可以使用列表框 CreateFcn
回调在列表框中添加项。
以下代码是列表框 CreateFcn
回调示例,用于为列表框填充列表项 Red
、Green
和 Blue
。
function listbox1_CreateFcn(hObject, eventdata, handles) % hObject handle to listbox1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles empty - handles not created until after all CreateFcns % Hint: listbox controls usually have a white background on Windows. if ispc && isequal(get(hObject,'BackgroundColor'), ... get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); end set(hObject,'String',{'Red';'Green';'Blue'});
set(hObject,'String',{'Red';'Green';'Blue'})
填充列表框的内容。更改选定项
当最终用户选中某个列表框项时,列表框的 Value
属性将更改为对应于该项在列表中的位置的数字。例如,值 1
对应于列表中的第一个项目。如果要在代码中更改选择,则将 Value
属性更改为介于 1
和列表项数之间的另一个数字。
例如,可以使用 GUIDE 中的 handles
结构体来访问列表框并更改 Value
属性:
set(handles.listbox1,'Value',2)
根据列表框 Tag
属性的值,您代码中的第一个参量 handles.listbox1
可能有所不同。
编写回调函数
以下代码是 GUIDE 中的列表框回调函数示例。将此函数与列表框的 Callback
属性关联,使其在选择列表框中的项时执行。
function listbox1_Callback(hObject, eventdata, handles) % hObject handle to listbox1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % Hints: contents = cellstr(get(hObject,'String')) returns contents % contents{get(hObject,'Value')} returns selected item from listbox1 items = get(hObject,'String'); index_selected = get(hObject,'Value'); item_selected = items{index_selected}; display(item_selected);
当最终用户选择列表框中的项时,回调函数将执行以下任务:
获取列表框中的所有项,并将其存储在变量
items
中。获取选定项的数值索引,并将其存储在变量
index_selected
中。获取选定项的值,并将其存储在变量
item_selected
中。在 MATLAB 命令行窗口中显示选定项。
示例GUIDE 中的交互式列表框 App 说明如何使用目录名称填充列表框。
弹出式菜单
填充弹出式菜单中的菜单项
如果您正在使用 GUIDE 开发 App,则可以使用弹出式菜单 CreateFcn
回调向弹出式菜单添加菜单项。
以下代码是弹出式菜单 CreateFcn
回调的示例,用于为该菜单填充菜单项 Red
、Green
和 Blue
。
function popupmenu1_CreateFcn(hObject, eventdata, handles) % hObject handle to popupmenu1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles empty - handles not created until after all CreateFcns % Hint: popupmenu controls usually have a white background on Windows. if ispc && isequal(get(hObject,'BackgroundColor'),... get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); end set(hObject,'String',{'Red';'Green';'Blue'});
set(hObject,'String',{'Red';'Green';'Blue'})
填充弹出式菜单的内容。更改选定项
当最终用户选择某个项时,弹出式菜单的 Value
属性将更改为对应于该菜单项在菜单中的位置的数字。例如,值 1
对应于列表中的第一个项目。如果要在代码中更改选择,则将 Value
属性更改为介于 1
和菜单中的菜单项数之间的另一个数字。
例如,可以使用 GUIDE 中的 handles
结构体来访问弹出式菜单并更改 Value
属性:
set(handles.popupmenu1,'Value',2)
根据弹出式菜单的 Tag
属性,您代码中的第一个参量 handles.popupmenu1
可能有所不同。
编写回调函数
以下代码是 GUIDE 中的弹出式菜单回调函数示例。将此函数与弹出式菜单的 Callback
属性关联,使其在最终用户选择菜单中的菜单项时执行。
function popupmenu1_Callback(hObject, eventdata, handles) % hObject handle to popupmenu1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % Hints: contents = cellstr(get(hObject,'String')) returns contents... % contents{get(hObject,'Value')} returns selected item... items = get(hObject,'String'); index_selected = get(hObject,'Value'); item_selected = items{index_selected}; display(item_selected);
当用户选择弹出式菜单中的菜单项时,回调函数将执行以下任务:
获取弹出式菜单中的所有项目,并将其存储在变量
items
中。获取选定项的数值索引,并将其存储在变量
index_selected
中。获取选定项的值,并将其存储在变量
item_selected
中。在 MATLAB 命令行窗口中显示选定项。
面板
使面板能够响应按钮点击
您可以创建在最终用户于面板上点击右键或左键时执行的回调函数。如果您正在使用 GUIDE,则右键点击布局中的面板,然后选择查看回调 > ButtonDownFcn,以创建回调函数。
以下代码是 GUIDE 中的 ButtonDownFcn
回调示例。
function uipanel1_ButtonDownFcn(hObject, eventdata, handles) % hObject handle to uipanel1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) display('Mouse button was pressed');
'Mouse button was pressed'
。调整窗口和面板大小
默认情况下,GUIDE UI 无法调整大小,但可通过选择工具 > GUI 选项并将调整大小的方式设为成比例来覆盖此行为。
当 UI 窗口可以调整大小时,窗口中的组件位置会随着用户调整窗口大小而调整。如果您的 UI 中包含面板,则面板大小也会随着窗口的大小的变化而变化。使用面板的 SizeChangedFcn
回调,让您的 App 在面板调整大小时执行特定任务。
以下代码是使用 GUIDE 创建的 App 中的面板 SizeChangedFcn
回调示例。当用户调整窗口大小时,此函数将修改面板内静态文本的字体大小。
function uipanel1_SizeChangedFcn(hObject, eventdata, handles) % hObject handle to uipanel1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) set(hObject,'Units','Points') panelSizePts = get(hObject,'Position'); panelHeight = panelSizePts(4); set(hObject,'Units','normalized'); newFontSize = 10 * panelHeight / 115; texth = findobj('Tag','text1'); set(texth,'FontSize',newFontSize);
如果您的 UI 包含嵌套面板,则可以从内而外调整其大小(按照子面板到父面板的顺序)。
注意
要自动调整面板内的文本大小,请将 fontUnits
属性设为 'normalized'
。
按钮组
按钮组与面板相似,但它们还能管理单选按钮和切换按钮的互斥选择。当按钮组包含多个单选按钮或切换按钮时,按钮组只允许最终用户选择其中一个。
不要为按钮组内的单个按钮编写回调代码,而应该使用按钮组的 SelectionChangedFcn
回调,在用户选择某个按钮时做出响应。
以下代码是用于管理两个单选按钮和两个切换按钮的按钮组 SelectionChangedFcn
回调的示例。
function uibuttongroup1_SelectionChangedFcn(hObject, eventdata, handles) % hObject handle to the selected object in uibuttongroup1 % eventdata structure with the following fields % EventName: string 'SelectionChanged' (read only) % OldValue: handle of the previously selected object or empty % NewValue: handle of the currently selected object % handles structure with handles and user data (see GUIDATA) switch get(eventdata.NewValue,'Tag') % Get Tag of selected object. case 'radiobutton1' display('Radio button 1'); case 'radiobutton2' display('Radio button 2'); case 'togglebutton1' display('Toggle button 1'); case 'togglebutton2' display('Toggle button 2'); end
当最终用户选择按钮组中的单选按钮或切换按钮时,此函数将基于按钮的 Tag
属性确定用户选择的按钮。然后,它将执行相应 case
内的代码。
注意
按钮组的 SelectedObject
属性包含用户所选按钮的句柄。您可以在代码中的其他位置使用此属性来确定用户所选的按钮。
菜单项
本节代码包含的示例回调函数会在最终用户选择此菜单中的编辑 > 复制 > 至文件时做出响应。
% -------------------------------------------------------------------- function edit_menu_Callback(hObject, eventdata, handles) % hObject handle to edit_menu (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) display('Edit menu selected'); % -------------------------------------------------------------------- function copy_menu_item_Callback(hObject, eventdata, handles) % hObject handle to copy_menu_item (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) display('Copy menu item selected'); % -------------------------------------------------------------------- function tofile_menu_item_Callback(hObject, eventdata, handles) % hObject handle to tofile_menu_item (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) [filename,path] = uiputfile('myfile.m','Save file name');
回调函数将会触发,以响应以下操作:
当最终用户选择编辑菜单时,
edit_menu_Callback
函数将会在 MATLAB 命令行窗口中显示文本'Edit menu selected'
。当最终用户将鼠标悬停在复制菜单项上时,
copy_menu_item_Callback
函数将会在 MATLAB 命令行窗口中显示文本'Copy menu item selected'
。当最终用户点击至文件菜单项然后释放时,
tofile_menu_item_Callback
函数将会显示对话框,提示最终用户选择目标文件夹和文件名。
tofile_menu_item_Callback
函数会调用 uiputfile
函数,提示最终用户提供目标文件和文件夹。例如,如果您想要创建一个菜单项提示用户提供现有文件,并且您的 UI 中包含打开文件菜单项,则可以使用 uigetfile
函数。
在创建类似这样的级联菜单时,中间菜单项会在鼠标指针悬停在其上时触发。最终的结束菜单项会在鼠标按键在其上松开时触发。
如何更新菜单项复选标记
您可以在菜单项旁边添加复选标记,指示某个选项已启用。在 GUIDE 中,可以在菜单编辑器中选择在此菜单项前添加复选标记,使得菜单项默认处于选中状态。每次最终用户选择该菜单项时,回调函数都会开启或关闭复选标记。
以下代码显示如何更改菜单项旁边的复选标记。
if strcmp(get(hObject,'Checked'),'on') set(hObject,'Checked','off'); else set(hObject,'Checked','on'); end
strcmp
函数将两个字符向量进行比较,并在其匹配时返回 true
。在本例中,它将在菜单项的 Checked
属性与字符向量 'on'
匹配时返回 true
。
有关在 GUIDE 中创建菜单项的详细信息,请参阅为使用 GUIDE 创建的 App 创建菜单。
表
以下代码是表回调函数 CellSelectionCallback
的示例。将此函数与表的 CellSelectionCallback
属性关联,使其在最终用户选择表中的单元格时执行。
function uitable1_CellSelectionCallback(hObject, eventdata, handles) % hObject handle to uitable1 (see GCBO) % eventdata structure with the following fields % Indices: row and column indices of the cell(s) currently selected % handles structure with handles and user data (see GUIDATA) data = get(hObject,'Data'); indices = eventdata.Indices; r = indices(:,1); c = indices(:,2); linear_index = sub2ind(size(data),r,c); selected_vals = data(linear_index); selection_sum = sum(sum(selected_vals))
当最终用户选择表中的单元格时,此函数将会执行以下任务:
获取表中的所有值,并将其存储在变量
data
中。获取所选单元格的索引。这些索引对应于
data
中的行和列。将行和列索引转换为线性索引。线性索引允许您使用一条命令选择数组中的多个元素。
获取最终用户所选的值,并将其存储在变量
selected_vals
中。为所有选定的值求和,并在命令行窗口中显示结果。
以下代码是表回调函数 CellEditCallback
的示例。将此函数与表的 CellEditCallback
属性关联,使其在最终用户编辑表中的单元格时执行。
function uitable1_CellEditCallback(hObject, eventdata, handles) % hObject handle to uitable1 (see GCBO) % eventdata structure with the following fields % Indices: row and column indices of the cell(s) edited % PreviousData: previous data for the cell(s) edited % EditData: string(s) entered by the user % NewData: EditData or its converted form set on the Data property. % Empty if Data was not changed % Error: error string when failed to convert EditData data = get(hObject,'Data'); data_sum = sum(sum(data))
ColumnEditable
属性设为 true
,才能允许最终用户编辑表中的单元格。坐标区
本节代码是在最终用户点击坐标区时触发的坐标区 ButtonDownFcn
示例。
function axes1_ButtonDownFcn(hObject, eventdata, handles) % hObject handle to axes1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) pt = get(hObject,'CurrentPoint')