【发布时间】:2013-10-23 06:26:13
【问题描述】:
我在 Matlab 中创建了一个 UItable,其中填充了各种值和选项。 它看起来像:
对应的代码如下:
selector_1 = { 'A'; 'B' ; 'C' };
selector_2 = { 'A.1'; 'A.2'; 'A.3'; ...
'B.1'; 'B.2'; 'B.3'; ...
'C.1'; 'C.2'; 'C.3' };
rows = 5;
f = figure('name','Configuration of output','Position',[200 200 430 25+rows*20],'numbertitle','off','MenuBar','none');
dat = {'select outputfile...', 'select identifier...', 'Specifier', 'Index'};
dat = repmat(dat,rows,1);
columnname = {'Output file ',...
'Identifier ',...
'Specifier ', 'Index'};
columnformat = { {selector_1{:}}, {selector_2{:}}, 'char', 'numeric' };
columneditable = [true true true true];
t = uitable('Units','normalized','Position',...
[0 0 1 1], 'Data', dat,...
'ColumnName', columnname,...
'ColumnFormat', columnformat,...
'ColumnEditable', columneditable,...
'RowName',[]);
set(t, 'Data', dat,'celleditcallback','get(t,''Data'')');
所以我运行代码,图就打开了。因此,底层脚本已经完成。 当我现在编辑表格时,我的 uitable 对象已更改,完成后我可以通过以下方式获得最终配置:
finalconfig = get(t,'Data');
但问题是我需要手动输入这一行,因为我的脚本已经完成。如果我将此行放在脚本的末尾,则会出现错误。
所以我考虑使用以下循环来检测我何时关闭表并存储最后一个配置
while ~isempty(findobj('name','Configuration of output'))
% some action
end
finalconfig = get(t,'Data');
我尝试了将所有内容放入循环中,整个脚本,包括celleditcallback 在内的set 命令和其他东西,但没有任何效果。当我编辑一个值时,要么我的脚本卡在循环中,要么我的表格的显示没有更新。我还在不同的位置尝试了drawnow。如何处理这种情况?如何自动存储我的最终结果?
我认为“关闭窗口”是最好的检测动作,因为我认为我无法实现“保存”按钮。我还尝试使用GUIDE 创建一个 gui,但完全迷路了,我希望没有解决它。
编辑: 我现在能够实现“保存”按钮并尝试如下回调:
uimenu('Label','Save configuration','Callback',@saveConfig);
function saveConfig(~,~)
output = get(t,'Data',);
save([pwd 'output.mat'],'output');
end
我还按照 Lucius Domitius Ahenobarbus 的建议实现了自定义 CloseRequestFcn。但后来我遇到了以下任一问题:
1)
我将所有内容定义为脚本,一切正常,但我需要将 @saveConfig(实际上是我最喜欢的)或 @my_Closefcn 等函数定义为我工作区中的唯一函数文件,我很难传递正确的参数因为dat 总是保持不变,即使它实际上已经改变了。
(example from the mathworks site 有效!但它不需要额外的参数。)
2)当我使用时
function configuration
% my script from above
end
我可以直接(嵌套)实现@saveConfig 或@my_Closefcn,我猜参数的传递可以正常工作。但是我的表格的编辑不再起作用,抛出以下错误:
使用 handle.handle/get 时出错
无效或已删除的对象。
评估合适的 CellEditCallback 时出错
如何解决?
现在我知道我什至可以将按钮添加到我真的很想避免使用 GUIDE 的 uitable 中。
我上面的代码是可执行的,所以如果你尝试看看我的实际问题是什么,我会很高兴,因为它很难描述。
【问题讨论】:
标签: matlab user-interface callback matlab-uitable