如何在从其他函数创建后更新 uitable?

How to update a uitable after creation from other functions?

我创建了一个 matfile,其中存储了不断被用户行为覆盖的数据。这发生在函数 "test()".

n=1
while n < 5 
    myVal = double(Test704(1, 780, -1)) %Returns the user's behavior
    if myVal == 1
        n = n + 1 %"n" is the overwritten variable in the matfile
    end

    save('testSave1.mat') %The matfile
    m = matfile('testSave1.mat')
end

然后,我想在另一个名为"storageTest()"的函数中显示这些数据(必须有两个独立的函数)。更具体地说,storageTest() 是一个 GUI 函数,我在其中开发了一个 uitable "t"。所以,我首先调用函数"test()",并将其输出值作为"t"的数据。这是"storageTest"中有趣部分的代码:

m = test()
    d = [m.n]
    t = uitable('Data',d, ...
        'ColumnWidth',{50}, ...
        'Position',[100 100 461 146]);
    t.Position(3) = t.Extent(3);
    t.Position(4) = t.Extent(4);

    drawnow

此代码仅在 "m = test()" 运行 结束时执行,并显示一个选项卡,我可以在其中看到 "n" 的最终值。但是,我希望之前显示我的 table 并看到我的值根据用户的行为增加。 我已经在网上搜索解决我的问题,但我找不到任何答案,是否可以这样做?

假设我正确地解释了这个问题,如果您在调用 test 之前初始化您的 table 然后将句柄传递给您的 table testwhile 循环中更新:

例如:

function testGUI
% Initialize table
t = uitable('ColumnWidth',{50}, 'Position',[100 100 461 146]);
test(t)

function test(t)
n = 1;
while n < 5
    n = n + 1;
    t.Data = n;
    pause(0.25); % Since we're just incrementing a number, a slight so we can actually see the change
end

当您 运行 执行上述操作时,您会注意到 table 中的数据按预期迭代。

写的和我基本一样的答案要快一点。由于它看起来略有不同,我还是 post 它。

function storagetest()
    close all
    f = figure;
    data = [1];
    t = uitable(f,'Data',data,'ColumnWidth',{50});
    test()
end

function test()
    % handle uitable
    t = evalin('caller','t')

    n = 1;
    while n < 5
        newVal = input('Enter a number:');
        data = get(t,'Data');
        set(t,'Data', [data; newVal]);
        n = n + 1;
    end

end

我用input函数模仿的"user behaviour"。基本思想是从 test() 中更新您的 table。 evalin 你可以使用,如果你不想传递参数给 test(),虽然直接传递 uitable 的句柄肯定是更好的选择。

如果您正在从事严肃的 GUI 项目,我强烈建议您阅读 this answer