以编程方式保存可编辑的uitable的更改

时间:2013-10-15 12:36:35

标签: matlab user-interface callback matlab-uitable

我在Matlab中创建了一个UItable,我用各种值和选项填充。 它看起来像:

enter image description here

相应的代码如下:

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');

我尝试了将所有内容放入循环,整个脚本,包括set的{​​{1}}命令以及其他内容,但没有任何效果。当我编辑一个值时,我的脚本会被卡在循环中,或者我的表的显示不会更新。我也在不同的位置试过celleditcallback。人们如何处理这种情况?如何自动存储我的最终结果? 我认为“关闭窗口”是检测的最佳动作,因为我认为我不能实现“保存”按钮。我也尝试使用drawnow创建一个gui但完全迷失了,我希望不用解决它。


编辑: 我现在能够实现“保存”按钮并尝试回调如下:

GUIDE

我也按照Lucius Domitius Ahenobarbus的建议实施了一个自定义uimenu('Label','Save configuration','Callback',@saveConfig); function saveConfig(~,~) output = get(t,'Data',); save([pwd 'output.mat'],'output'); end 。但后来我遇到以下问题之一:

1) 我将所有内容定义为脚本,一切正常,但我需要将CloseRequestFcn(实际上我最喜欢的)或@saveConfig等函数定义为我工作区中的唯一函数文件,我很难传递正确的参数,因为@my_Closefcn始终保持不变,即使它实际上得到了更改。 (example from the mathworks site有效!但它不需要额外的参数。)

2)当我使用

dat

我可以直接实现function configuration % my script from above end @saveConfig(嵌套),我猜参数的传递可以正常工作。但是我的表的编辑不再起作用,抛出以下错误:

  

使用handle.handle / get

时出错      

无效或删除对象。

     

评估uitable CellEditCallback

时出错

如何解决? 现在我知道我甚至可以添加按钮给一个合适的人我真的想避免@my_Closefcn。 我上面的代码是可执行的,所以如果你试着看看我的实际问题是什么,我很高兴,因为它很难描述。

2 个答案:

答案 0 :(得分:3)

取决于是否使用GUIDE:

使用CloseRequestFcn->

没有GUIDE使用:

%write your own CloseRequestFcn and set the figure CloseRequest-Callback to it:
set(gcf,'CloseRequestFcn',@my_closefcn)
%use gcf or the handle of the figure directly

并定义my_closefcn,包括图形句柄的删除语句,否则图形不会关闭:)

有关“重新定义CloseRequestFcn”的更多信息,请参阅文档。

指南:

您可以通过检查图来编辑CloseRequestFcn。有一个名为CloseRequestFcn的字段将自动创建该函数,您不需要关心获取句柄。它看起来像这样:

function figure1_CloseRequestFcn(hObject, eventdata, handles)
% hObject    handle to figure1 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hint: delete(hObject) closes the figure
delete(hObject);

现在删除图之前,您应该能够获取uitable的数据(如果您有句柄),我建议只将数据分配给基础工作区,如:

assignin('base', 'finalTableData', get(myTableHandle,'Data'));

修改

因为我不够清楚,请看这个例子:

(在一个脚本中使用) - >

function test
h=figure;
x=1:10;
mytable=uitable(h,'Data',x);
set(h,'CloseRequestFcn',@myCloseFcn)
%give a unique Tag:
set(h,'Tag', 'myTag')
set(mytable,'Tag','myTableTag')
end

function myCloseFcn(~,~)
myfigure=findobj('Tag','myTag');
myData=get(findobj(myfigure,'Tag','myTableTag'),'Data')
assignin('base','myTestData',myData)
delete(myfigure)
end

实际上,如果您知道如何找到图形的句柄,则无需关注Closereq-Callback的参数!只是给你的数字提供一些东西/你可以在以后识别它。我使用'Tag',因为我会想到的第一件事,但也会有其他参数。

答案 1 :(得分:0)

在代码之后直接运行代码或代码内部之间,我只能想到两个不同之处。

<强> 1。范围

也许您实际上在使用函数而不是脚本。在这种情况下,问题可能是在您的函数内部,您需要的东西超出范围。

<强> 2。定时

虽然很少见,但有时计算机似乎已经完成,而实际上它仍然很忙(几毫秒左右)。


以下是一般方法的步骤:

  1. 确保在您要插入命令的地方有一条简单的行(例如1==1
  2. 在第
  3. 行放置一个断点
  4. 一旦matlab在断点处停止,请等待一秒钟并尝试运行您的命令。
  5. 如果有效,我会打赌第2号问题。尝试在命令之前放置一个pause(1),看看它是否有帮助。

    如果它不起作用,你可能会遇到第1号问题。现在找到一个正确的地方来处理你的命令。如果命令不能放在代码中的其他地方,也许可以尝试一个丑陋的evalin(,'base')。但是,后者应该被视为一种解决方法而不是解决方案。