Main Content

特定组件的回调

注意

在以后的版本中将会删除 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 属性,然后将其与 MaxMin 属性进行比较。如果按钮处于按下状态,则函数将在命令行窗口中显示 '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 属性,然后将其与 MaxMin 属性进行比较。如果按钮被选中,则函数将在命令行窗口中显示 '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 属性,然后将其与 MaxMin 属性进行比较。如果复选框被选中,则函数将在命令行窗口中显示 '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 键后,回调函数将检索这些字符,并在命令行窗口中显示它们。

要允许用户输入多行文本,请将 MaxMin 属性设为满足 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]。要修改范围,请将滑块的 MaxMin 属性分别设为最大值和最小值。

列表框

填充列表框中的项

如果您正在使用 GUIDE 开发 App,则可以使用列表框 CreateFcn 回调在列表框中添加项。

以下代码是列表框 CreateFcn 回调示例,用于为列表框填充列表项 RedGreenBlue

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 回调的示例,用于为该菜单填充菜单项 RedGreenBlue

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 属性包含用户所选按钮的句柄。您可以在代码中的其他位置使用此属性来确定用户所选的按钮。

菜单项

本节代码包含的示例回调函数会在最终用户选择此菜单中的编辑 > 复制 > 至文件时做出响应。

Figure window with a menu bar. The menu has two options, "File" and "Edit". The "Edit" option is selected and contains a submenu with items "Cut", "Copy", and "Paste". The "Copy" option is highlighted and contains another submenu with one item, "To File".

% --------------------------------------------------------------------
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');
根据在 GUIDE 菜单编辑器中指定的标记名称,您代码中的函数名称可能有所不同。

回调函数将会触发,以响应以下操作:

  • 当最终用户选择编辑菜单时,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 示例。

Axes in a figure window

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')
当最终用户点击坐标区(而不是点击坐标区的其他父图形对象)时,指针的坐标将会显示在 MATLAB 命令行窗口中。

注意

大多数 MATLAB 绘图函数会在绘制数据之前清除坐标区并重置多个坐标区属性,包括 ButtonDownFcn。要创建允许最终用户以交互方式绘制数据的界面,应考虑提供普通按钮等组件来控制绘图。这类组件的属性不受绘图函数的影响。如果必须使用坐标区 ButtonDownFcn 来绘制数据,则请使用 linepatchsurface 等函数。

相关主题