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

Matlab 以编程方式保存对可编辑uitable的更改,matlab,user-interface,callback,matlab-uitable,Matlab,User Interface,Callback,Matlab Uitable,我在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','Con

我在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');
我试着把所有的东西都放进循环中,整个脚本,只有
set
命令,包括
celleditcallback
,还有其他的东西,但是没有任何效果。当我编辑一个值时,要么我的脚本在循环中被阻塞,要么我的表的显示没有更新。我还在不同的位置尝试了
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
始终保持不变,即使它实际上发生了更改。 (这是可行的!但不需要额外的参数。)

2)当我使用

function configuration
% my script from above
end
我可以直接(嵌套)实现
@saveConfig
@my_Closefcn
,我想传递参数会很好。但编辑我的表格不再有效,引发以下错误:

使用handle.handle/get时出错

无效或已删除的对象

计算uitable CellEditCallback时出错

如何解决这个问题? 现在我知道我甚至可以在uitable中添加按钮,我真的很想避免使用
GUIDE

我上面的代码是可执行的,所以如果您尝试查看我的实际问题是什么,我会很高兴,因为这很难描述。

取决于是否使用指南:

使用CloseRequestFcn->

无指南使用:

%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,包括图形句柄的delete语句,否则图形将不会关闭:)

有关“重新定义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'));
编辑

由于我不够清楚,请参见以下示例:

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


事实上,如果您知道如何找到该图的句柄,就不需要关心Closereq回调的参数!只要给你的身材/表一些你以后能够识别的东西。我使用了“Tag”,因为我想到的第一件事是,但也会有其他参数。

在代码之后直接运行代码和在代码内部运行代码之间,我只能想到两个区别

1。范围

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

2。计时

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


以下是一般方法的步骤:

  • 确保在要插入命令的位置有一行小代码(例如
    1==1
  • 在该行上放置断点
  • 一旦matlab在断点处停止,请等待一秒钟并尝试运行您的命令
  • 如果可行的话,我会把赌注押在第二道题上。尝试在命令前放置一个
    暂停(1)
    ,看看是否有帮助


    如果它不起作用,您可能会遇到问题1。现在的问题是找到合适的地方来执行命令。如果命令不能放在代码的其他地方,可以尝试使用丑陋的
    evalin(,'base')
    。但是,后者应该被视为一种解决方法,而不是一种解决方案。

    我不能让它起作用,请看我编辑的问题。我认为这是一个很好的方法,尽管我更喜欢“保存”按钮。这两种方法仍然有相同的困难。现在它甚至适用于我的示例。您的示例和我的示例之间唯一的区别是我使用了
    set(t,'Data',dat,'celleditcallback','get(t,'Data')x
    ,而不是第二个函数?这既不是我身材的一部分,也不是我桌子的一部分。我不知道如何访问函数工作区。为此,我建议使用guidat
    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