我在MATLAB中有一个使用uitables输入的GUI。有一个固定数字列,每列都有一个非常特定的格式,我已经存储为单元格数组,如下所示:
columnformat = {'text', 'numeric', {@doSomething, inputArg1}, {'Option1' 'Option2'}};
行数在理论上是无限的;用户可以提供他们喜欢的任意数量。后端能够处理任意多行输入。现在,我最初建立了一个大型的,并假设用户不会全部使用它。
这里有一个问题:我想设置表格和相关代码,这样当用户选择最后一行并按下回车键时,它会创建一个新行,其格式与其余部分相同。表
我尝试了很多不同的方法,包括动态设置“数据”,它们似乎都打破了单元格阵列所规定的自定义格式。我确定之前有人这样做过。谢谢你的帮助!
答案 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
对不起,如果一切都有点简单和未经测试,但一个好的答案需要相当大的努力,我没有时间。标签matlab-uitable可以为您提供更多进一步的想法。