记录做课程报告时遇到的问题。
1 GUI模板
命令行输入“guide”
2 生成随机数据
同一个表中字段格式不一,用struct格式保存数据,再转换成cell格式,才可以将数据插入表格中,struct、table格式会报错。
3 添加学生信息
代码:
function addStudent_Callback(hObject, eventdata, handles)
% hObject handle to addStudent (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
prompt = {'学号','姓名','高考成绩','Java','Web','JVM','MySQL','并发编程'};
title = "请输入数据";
lines = [1,1,1,1,1,1,1,1];
tab = inputdlg(prompt,title,lines);
newrow_1 = str2double(tab{1});
newrow_2 = tab{2};
newrow_3 = str2double(tab{3});
newrow_4 = str2double(tab{4});
newrow_5 = str2double(tab{5});
newrow_6 = str2double(tab{6});
newrow_7 = str2double(tab{7});
newrow_8 = str2double(tab{8});
newrow_9 = newrow_4+newrow_5+newrow_6+newrow_7+newrow_8;
newArray = {newrow_1,newrow_2,newrow_3,newrow_4,newrow_5,newrow_6,newrow_7,newrow_8,newrow_9,0};
oldData = get(handles.stu_info,'Data');
newData = [oldData;newArray];
[~, ~, forwardRank] = unique([newData{:,9}]);
b = max(forwardRank) - forwardRank + 1;
for i = 1:size(newData,1)
newData{i,10} = b(i);
end
set(handles.stu_info,"Data",newData);
save("newData.mat",'newData');
效果:
4 删除学生信息
操作:
代码:
function stu_info_CellSelectionCallback(hObject, eventdata, handles)
% hObject handle to stu_info (see GCBO)
% eventdata structure with the following fields (see MATLAB.UI.CONTROL.TABLE)
% Indices: row and column indices of the cell(s) currently selecteds
% handles structure with handles and user data (see GUIDATA)
newData = get(hObject,'Data');
row = eventdata.Indices;
rowIndex = row(1);
handles.rowIndex = rowIndex;
guidata(hObject,handles);
% --- Executes on button press in delete.
function delete_Callback(hObject, eventdata, handles)
% hObject handle to delete (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
row_index = handles.rowIndex;
newData = get(handles.stu_info,'Data');
newData(row_index,:) = [];
[~, ~, forwardRank] = unique([newData{:,9}]);
b = max(forwardRank) - forwardRank + 1;
for i = 1:size(newData,1)
newData{i,10} = b(i);
end
set(handles.stu_info,'Data',newData);
save("info.mat","newData");
Q1:能正常删除,却一直报索引超出范围的错误;因为出错,排名也没有更新。
索引超出数组元素的数目(0)。
出错 stu_info>stu_info_CellSelectionCallback (第 119 行)
rowIndex = row(1);
出错 gui_mainfcn (第 95 行)
feval(varargin{:});
出错 stu_info (第 42 行)
gui_mainfcn(gui_State, varargin{:});
出错
matlab.graphics.internal.figfile.FigFile/read>@(hObject,eventdata)stu_info('stu_info_CellSelectionCallback',hObject,eventdata,guidata(hObject))
计算 Table CellSelectionCallback 时出错。
A1:报错的问题
报错原因:eventdata.Indices只有在选定单元格时才为非空。改变uitable大小时也会触发CellSelectionCallback,但此时没有选中单元格,所以Indices为空。
改变uitable大小的例子:set(uitable_handles,'data',...),存入数据时单元格会跟随数据改变大小。
解决方法:在取Indices时加一个判断,isempty
row = eventdata.Indices;
if isempty(row)~= 1
rowIndex = row(1);
handles.rowIndex = rowIndex;
end
此时排名依然没有自动更新。后来发现是更新了的,没做好测试。
Q2:删除的速度很慢
5 修改学生信息
代码:
function update_Callback(hObject, eventdata, handles)
% hObject handle to update (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
ri = handles.rowIndex;
newData = get(handles.stu_info,"Data");
prompt = {'学号','姓名','高考成绩','Java','Web','JVM','MySQL','并发编程'};
title = "数据更新页面";
lines = [1,1,1,1,1,1,1,1];
definput = {};
for i = 1:8
definput{i} = num2str(newData{ri,i});
end
tab = inputdlg(prompt,title,lines,definput);
if size(tab,1)~=0 %加个判断 避免点击取消不做更改时报错
newrow_1 = str2double(tab{1});
newrow_2 = tab{2};
newrow_3 = str2double(tab{3});
newrow_4 = str2double(tab{4});
newrow_5 = str2double(tab{5});
newrow_6 = str2double(tab{6});
newrow_7 = str2double(tab{7});
newrow_8 = str2double(tab{8});
newrow_9 = newrow_4+newrow_5+newrow_6+newrow_7+newrow_8;
newArray = {newrow_1,newrow_2,newrow_3,newrow_4,newrow_5,newrow_6,newrow_7,newrow_8,newrow_9,0};
newData(ri,:) = newArray;
[~, ~, forwardRank] = unique([newData{:,9}]);
b = max(forwardRank) - forwardRank + 1;
for i = 1:size(newData,1)
newData{i,10} = b(i);
end
end
set(handles.stu_info,"Data",newData);
save("info.mat",'newData');
主要问题:inputdlg(prompt,title,lines,definput);
默认答复必须为字符向量元胞数组。
definput:必须为字符向量元胞数组或字符串数组。报错是因为放入元胞数组的数据是double型的,通过num2str更改数据格式,问题解决。