在MATLAB中启用/禁用uitabs

时间:2016-05-25 08:45:27

标签: java matlab tabs

我在我的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) 

有人可以帮我解决这个问题,或者建议一些启用/禁用标签的替代方法。

4 个答案:

答案 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属性设置为childrenenable

在以下代码中:

  • 创建on,其中包括两个off
  • 添加了uitabgroup的{​​{1}}个iutab,并将初始iutab状态设置为' off` 图中的
  • ,添加了两个uicontrols以启用/停用两个enable的{​​{1}}

获取hanles并启用/禁用checkbox的功能已被直接写为uicontrols的{​​{1}}

uitab

enter image description here

希望这有帮助。

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'};

enter image description here

另一个建议是采用纯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

结束