我在我的GUI中使用matlab中的uitab组。但UItabgroup的一个限制是缺少启用/禁用功能。我试图通过使用matlab communnity findjObject
中的函数来使用其他替代方法。我使用以下方法使用上述功能。
Warning: on line 5 of test.xsd:
The complex type typeOne does not allow a child element named eleOne
我收到以下错误
jtabgroup=findjobj(tabgroup);
jtabgroup.setEnableAt(false); % also I tried turning enable off for
% for individual tabs using setEnabledAt(1,0)
有人可以帮我解决这个问题,或者建议一些启用/禁用标签的替代方法。
答案 0 :(得分:0)
不幸的是,正如评论中所述,uitab
没有enable
属性。
这是iutab
对象的列表:
BackgroundColor
BeingDeleted
BusyAction
ButtonDownFcn
Children
CreateFcn
DeleteFcn
ForegroundColor
HandleVisibility
Interruptible
Parent
Position
SizeChangedFcn
Tag
Title
TooltipString
Type
UIContextMenu
Units
UserData
可能的解决方法是启用/停用属于uicontrols
的{{1}}。
您可以获取uitab
的{{1}}列表,因为它们处理的内容存储在uicontrols
属性中。
获得句柄后,您可以将uitab
属性设置为children
或enable
。
在以下代码中:
on
,其中包括两个off
uitabgroup
的{{1}}个iutab
,并将初始iutab
状态设置为' off`
图中的uicontrols
以启用/停用两个enable
的{{1}} 获取hanles并启用/禁用checkbox
的功能已被直接写为uicontrols
的{{1}}
uitab
希望这有帮助。
Qapla'
答案 1 :(得分:0)
您可以而且应该使用精彩的GUI Layout Toolbox代替uitab
。它允许您有选择地禁用开箱即用的选项卡,更不用说大量其他有用的功能。 FEX有两个提交,一个用于HG1(uiextras
包),另一个用于HG2(uix
包,具有向后兼容的uiextras
接口。)
这是HG2的例子。您需要将TabEnables
属性设置为'on'
/ 'off'
值的数组,每个标签一个(不是最用户友好的API,但是,嘿,这远远好于其他任何东西)。
f = figure();
p = uix.TabPanel('Parent', f,'Padding', 5);
uicontrol('Style', 'frame', 'Parent', p, 'Background', 'r');
uicontrol('Style', 'frame', 'Parent', p, 'Background', [.8 .8 .8]);
uicontrol('Style', 'frame', 'Parent', p, 'Background', 'g');
p.TabTitles = {'Red', 'Gray', 'Green'};
p.Selection = 2;
p.TabEnables = {'on','on','off'};
另一个建议是采用纯Java解决方案。这显然假设您只能在选项卡中放置java组件,但除了轴之外,几乎任何Matlab UI组件都可以轻松替换为性能更好且更好看的Java组件。
答案 2 :(得分:0)
如果您正在使用App Designer或以其他方式使用基于Web的MATLAB GUI,则JavaFrame UI内容无效,因此基于findjobj
的用于禁用标签页的解决方案将无效。
对于基于Web的GUI,有一个类似的脚本findjobj称为mlapptools
。粗略地讲,您可以使用它来查找具有<div>
类并包含带有tab
类的跨度的mwTabHeader
,然后使用CSS pointer-events
属性禁止在标签上输入。这使用户无法单击该选项卡,从而切换该选项卡并激活任何回调函数。我在使用mlapptools导航HTML树时遇到了麻烦,所以最终我还是使用了文本分析工具箱来做到这一点。
% Get the HTML code that makes the figure and parse it to look for <div>s
page = mlapptools.getHTML(hUIFigure);
page = strrep(page, '\n', newline); % I had issues with HTML parsing without
page = strrep(page, '\"', '"'); % these additional substitutions
tree = htmlTree(page);
subtrees = findElement(tree, 'div');
% Get all of the current tabs titles
tabs = {tabgroup.Children.Title};
tabIDs = cell(size(tabs));
% For each DIV, match it up to a tab and extract the widgetid
for ii=1:length(subtrees)
if contains(getAttribute(subtrees(ii), 'class'), 'tab') && ...
contains(sprintf('%s', subtrees(ii)), 'mwTabHeader')
for jj=1:length(tabs)
if strcmp(strtrim(extractHTMLText(subtrees(ii))), tabs{jj})
tabIDs{jj} = char(getAttribute(subtrees(ii), 'widgetid'));
break
end
end
end
end
fprintf('Locking tabs...\n');
win = mlapptools.getWebWindow(hUIFigure);
currentTab = find(tabgroup.SelectedTab == tabgroup.Children);
for ii=1:length(tabIDs)
if ii ~= currentTab
% execute dojo queries for each tab to set the style
% note the DOM format CSS
win.executeJS(sprintf('dojo.style(dojo.query("[%s = ''%s'']")[0], "%s", "%s")', ...
'widgetid', tabIDs{ii}, ...
'pointerEvents', 'none'));
win.executeJS(sprintf('dojo.style(dojo.query("[%s = ''%s'']")[0], "%s", "%s")', ...
'widgetid', tabIDs{ii}, ...
'color', 'grey'));
end
end
fprintf('Unlocking tabs...\n');
for ii=1:length(tabIDs)
win.executeJS(sprintf('dojo.style(dojo.query("[%s = ''%s'']")[0], "%s", "%s")', ...
'widgetid', tabIDs{ii}, ...
'pointerEvents', 'auto'));
win.executeJS(sprintf('dojo.style(dojo.query("[%s = ''%s'']")[0], "%s", "%s")', ...
'widgetid', tabIDs{ii}, ...
'color', 'black'));
end
答案 3 :(得分:0)
对我来说更简单的解决方案-我有一种方法可以递归地在选项卡中查找组件并设置启用(如果可以启用)。注意:这不会启用整个标签,但会启用内容。为了获得最佳图形效果,我忽略了某些元素
函数setEnableWithChildren(应用,组件,值) %递归设置所有项目的启用状态
if isa(component, 'matlab.ui.control.Label') || isa(component, 'matlab.ui.control.Lamp')
return % Don't enable labels, etc.
end
if isprop(component, 'Enable')
if isa(component, 'matlab.ui.control.Table')
if value
component.Enable = 'on'; % Table uses on/off
else
component.Enable = 'off';
end
else
component.Enable = value;
end
end
if isprop(component, 'Children')
children = allchild(component);
else
children = [];
end
for child = reshape(children, 1, [])
app.setEnableWithChildren(child, value);
end
结束