从用户输入生成MATLAB uitable行

时间:2014-04-26 03:51:58

标签: matlab matlab-guide matlab-uitable

我在MATLAB中有一个使用uitables输入的GUI。有一个固定数字列,每列都有一个非常特定的格式,我已经存储为单元格数组,如下所示:

columnformat = {'text', 'numeric', {@doSomething, inputArg1}, {'Option1' 'Option2'}};

行数在理论上是无限的;用户可以提供他们喜欢的任意数量。后端能够处理任意多行输入。现在,我最初建立了一个大型的,并假设用户不会全部使用它。

这里有一个问题:我想设置表格和相关代码,这样当用户选择最后一行并按下回车键时,它会创建一个新行,其格式与其余部分相同。表

我尝试了很多不同的方法,包括动态设置“数据”,它们似乎都打破了单元格阵列所规定的自定义格式。我确定之前有人这样做过。谢谢你的帮助!

2 个答案:

答案 0 :(得分:2)

此解决方案适用于使用MATLAB GUIDE创建的GUI。我认为MATLAB GUI显示奇怪的行为是正确的,但是我在使用keyboard之类的调试MATLAB回调并且没有使用dbquit正确退出时看到了大多数奇怪的行为。因此,我的建议是远离使用与GUIDE创建的MATLAB GUI的键盘相关命令。

现在,回到解决您的问题,请按照以下步骤操作。

第1步:在GUINAME__OpeningFcn开头添加:

handles.row_col_prev = [1 1];

第2步:在上下文中点击表格的属性,然后点击CellSelectionCallback。因此,如果表的标记是uitable1,它将创建一个名为 - uitable1_CellSelectionCallback的函数。

假设GUI的图形具有标记 - addrows_figure

在其中添加以下内容:

%%// Detect the current key pressed
currentkey = get(handles.addrows_figure,'CurrentCharacter')

%%// Read in previous row-col combination
prev1 = handles.row_col_prev

%%// Read in current data. We need just the size of it though.
data1 = get(handles.uitable1,'Data');

%%// Main processing where a row is appended if return is pressed
if numel(prev1)~=0
    if size(data1,1)==prev1(1) & currentkey==13 %%// currentkey==13 denotes carriage return in ascii
        data1(end+1,:) = repmat({''},1,size(data1,2)); %%// Append empty row at the end 
        set(handles.uitable1,'Data',data1); %%// Save it back to GUI
    end
end

%%// Save the current row-col combination for comparison in the next stage
%%// when selected cell changes because of pressing return
handles.row_col_prev = eventdata.Indices;
guidata(hObject, handles);

希望这对你有用!

答案 1 :(得分:1)

我想不出用某个键实现你想要的东西的可能性,我认为可以使用任何键(KeyPressFcn)。但我宁愿建议引入一个带按钮的工具栏:

h = figure(...
u = uitable(h, ...
set(u,'Tag','myTable')
tbar = uitoolbar(h);
uipushtool(tbar,'ClickedCallback',@addRow);

在你的回调函数中,你需要获取数据,添加一行并将其写回:

function addRow(~,~)

u = findobj(0,'Type','uitable','Tag','myTable');
data = get(u,'Data');
%// modify your data, add a row ...
set(src,'Data',data);

end

对不起,如果一切都有点简单和未经测试,但一个好的答案需要相当大的努力,我没有时间。标签可以为您提供更多进一步的想法。