组件: tabbox
,
tabs
,
tab
,
tabpanels
和tabpanel
。
Tab box 允许开发人员将大量组件分别置于几个组内,且每次只显示一组,这样用户界面不会太难于阅读。在同一时间内仅会显示一组(亦作,面板)。一旦一个隐藏组的tab被点击后,此组的组件变得可见而前一个可见组变得不可见。
tab box的通用语法如下。
<tabbox> <tabs> <tab label="First"/> <tab label="Second"/> </tabs> <tabpanels> <tabpanel>The first panel.</tabpanel> <tabpanel>The second panel</tabpanel> </tabpanels> </tabbox>
tabbox
: 外层的box , 包括一系列 tab 和tab面板。
tabs
: tab的容器, 也就是,tab 组件的集合。
tab
: 一个特定的tab。点击tab可以将其tab面板显示在前。你可以将标签或图像置于其中。
tabpanels
: tab面板的容器,也就是,tabpanel
组件的集合。
tabpanel
: 单一tab面板的主体。你可以将一组组件放置于一个tab面板内。第一个tabpanel
对应于第一个tab
, 第二个tabpanel
对应于第二个tab,依次类推。
当前选中的tab组件由selected
属性给出,将其设为true
。这样可以给当前选中tab不同的外观,这样可以容易看出被选中。在同一时间内,仅有一个tab的值为true
。
通过Java代码有两种方式可以改变选中的tab。如下所示,它们是等价的。
tab1.setSelected(true); tabbox.setSelectedTab(tab1);
当然,你可以直接将selected
属性设为true。
<tab label="My Tab" selected="true"/>
若没有tab被选中,则第一个自动被选中。
tab面板可以包含任何组件包括另一个tab box。
<tabbox> <tabs> <tab label="First"/> <tab label="Second"/> </tabs> <tabpanels> <tabpanel> The first panel. <tabbox> <tabs> <tab label="Nested 1"/> <tab label="Nested 2"/> <tab label="Nested 3"/> </tabs> <tabpanels> <tabpanel>The first nested panel</tabpanel> <tabpanel>The second nested panel</tabpanel> <tabpanel>The third nested panel</tabpanel> </tabpanels> </tabbox> </tabpanel> <tabpanel>The second panel</tabpanel> </tabpanels> </tabbox>
Tab box 支持两种模式(mold):default
和accordion
。accordion
模式的效果如下。
<tabbox mold="accordion"> <tabs> <tab label="First"/> <tab label="Second"/> </tabs> <tabpanels> <tabpanel>The first panel.</tabpanel> <tabpanel>The second panel</tabpanel> </tabpanels> </tabbox>
开发人员可以使用orient
属性来控制tab的方位。默认为水平布局。你可以将其变为垂直的,效果如下。
<tabbox width="400px" orient="vertical"> <tabs> <tab label="A"/> <tab label="B"/> <tab label="C"/> <tab label="D"/> <tab label="E"/> </tabs> <tabpanels> <tabpanel>This is panel A</tabpanel> <tabpanel>This is panel B</tabpanel> <tabpanel>This is panel C</tabpanel> <tabpanel>This is panel D</tabpanel> <tabpanel>This is panel E</tabpanel> </tabpanels> </tabbox>
开发人员可以使用tabs的align
属性控制tab的对齐方式。默认为start
(最左边或最上边)。你可以将其改为center
或end
(最右边或最底部),效果如下。
<tabbox width="250px"> <tabs align="end"> <tab label="Tab 1"/> <tab label="Tab 2"/> </tabs> <tabpanels> <tabpanel>This is panel 1</tabpanel> <tabpanel>This is panel 2</tabpanel> </tabpanels> </tabbox>
将closable
属性设置为true,tab会显示关闭按钮,这样用户可以通过点击按钮来关闭tab和相应的tab面板。一旦用户点击了close
按钮,onClose
事件会被送至tab。此事件会由Tab的onClose
方法来处理。然后,默认情况下,onClose
方法将tab本身及相应的tab面板移除。
参考window的closable
属性 。
通过将disabled
属性设置为true
,用户通过点击tab或close按钮不能选择或关闭相应的tab。但是,开发人员仍然可以编程控制tab的选择或关闭。
<tabbox width="300px" id="tbx"> <tabs> <tab label="Step 1" id="tb1" disabled="true"/> <tab label="Step 2" id="tb2" disabled="true"/> <tab label="Step 3" id="tb3" disabled="true"/> </tabs> <tabpanels> <tabpanel><button label="to Step2" onClick="tbx.selectedTab=tb2"/></tabpanel> <tabpanel><button label="to Step3" onClick="tbx.selectedTab=tb3"/></tabpanel> <tabpanel>This is panel 3</tabpanel> </tabpanels> </tabbox>
就像其它组件,你可以仅在tab面板变为可见时加载其内容。最简单的方式是使用fulfill
属性来推迟tab面板子组件的创建。
<tabbox> <tabs> <tab label="Preload" selected="true"/> <tab id="tab2" label="OnDemand"/> </tabs> <tabpanels> <tabpanel> This panel is pre-loaded since no fulfill specified </tabpanel> <tabpanel fulfill="tab2.onSelect"> This panel is loaded only tab2 receives the onSelect event </tabpanel> </tabpanels> </tabbox>
如果你更加喜欢手动创建子组件或自动操纵面板,你可以监听onSelect
事件,然后当面板被选中时填充其内容。如下所示,
<tabbox id="tabbox" width="400" mold="accordion"> <tabs> <tab label="Preload"/> <tab label="OnDemand" onSelect="load(self.linkedPanel)"/> </tabs> <tabpanels> <tabpanel> This panel is pre-loaded. </tabpanel> <tabpanel> </tabpanel> </tabpanels> <zscript><![CDATA[ void load(Tabpanel panel) { if (panel != null && panel.getChildren().isEmpty()) new Label("Second panel is loaded").setParent(panel); } ]]></zscript> </tabbox>