文档

Java™ 教程
隐藏目录
如何使用选项卡窗格
路径: 使用Swing创建GUI
课程: 使用Swing组件
章节: 如何使用不同的组件

如何使用选项卡窗格

使用JTabbedPane类,您可以有多个组件(如面板)共享相同的空间。用户可以通过选择对应所需组件的选项卡来选择要查看的组件。如果您希望在没有选项卡界面的情况下实现类似功能,则可以使用卡片布局而不是选项卡窗格。

创建选项卡窗格

要创建选项卡窗格,请实例化JTabbedPane,创建要显示的组件,然后使用addTab方法将这些组件添加到选项卡窗格中。

下面的图片介绍了一个名为TabbedPaneDemo的应用程序,它有一个带有四个选项卡的选项卡窗格。

TabbedPaneDemo的屏幕截图

试一试: 
  1. 点击“启动”按钮,使用Java™ Web Start运行TabbedPaneDemo(下载JDK 7或更高版本)。或者,如果想要自己编译和运行该示例,请参考示例索引启动TabbedPaneDemo应用程序
  2. 将光标放在选项卡上。
    选项卡的工具提示将显示出来。方便起见,您可以在将组件添加到选项卡窗格时指定工具提示文本。
  3. 通过单击选项卡选择一个选项卡。
    选项卡窗格会显示与选项卡对应的组件。
  4. 通过输入助记键选择一个选项卡。
    例如,在Java外观下,您可以通过键入Alt-3来选择标签为“Tab 3”的选项卡。
  5. 在可滚动的选项卡之间导航。
    此示例提供了可滚动的选项卡。通过移动对话框的左侧或右侧边界调整对话框的大小,使选项卡无法容纳在对话框中。选项卡旁边会出现滚动箭头。
    单击箭头以查看其中一个隐藏的选项卡。
    请注意,单击箭头只会显示隐藏的选项卡,而不会选择新的选项卡。

TabbedPaneDemo示例所示,选项卡可以具有工具提示和助记键,并且可以同时显示文本和图像。

选项卡位置

默认的选项卡位置设置为TOP位置,如上图所示。您可以使用setTabPlacement方法将选项卡位置更改为LEFTRIGHTTOPBOTTOM

选项卡面板的代码

下面的代码来自TabbedPaneDemo.java,创建了前面示例中的选项卡面板。请注意,不需要编写任何事件处理代码。JTabbedPane对象会为您处理鼠标和键盘事件。

JTabbedPane tabbedPane = new JTabbedPane();
ImageIcon icon = createImageIcon("images/middle.gif");

JComponent panel1 = makeTextPanel("面板1");
tabbedPane.addTab("选项卡1", icon, panel1,
                  "什么都不做");
tabbedPane.setMnemonicAt(0, KeyEvent.VK_1);

JComponent panel2 = makeTextPanel("面板2");
tabbedPane.addTab("选项卡2", icon, panel2,
                  "什么都不做两次");
tabbedPane.setMnemonicAt(1, KeyEvent.VK_2);

JComponent panel3 = makeTextPanel("面板3");
tabbedPane.addTab("选项卡3", icon, panel3,
                  "仍然什么都不做");
tabbedPane.setMnemonicAt(2, KeyEvent.VK_3);

JComponent panel4 = makeTextPanel(
        "面板4(首选大小为410 x 50).");
panel4.setPreferredSize(new Dimension(410, 50));
tabbedPane.addTab("选项卡4", icon, panel4,
                      "根本什么都不做");
tabbedPane.setMnemonicAt(3, KeyEvent.VK_4);

正如上面的代码所示,addTab方法负责设置选项卡面板中的大部分工作。addTab方法有几种形式,但它们都使用字符串标题和要显示在选项卡中的组件。可选地,您可以指定一个图标和工具提示字符串。文本或图标(或两者)都可以为null。创建选项卡的另一种方法是使用insertTab方法,它允许您指定要添加的选项卡的索引。请注意,addTab方法在此步骤中不允许指定索引。

切换到特定选项卡

有三种方法可以使用GUI切换到特定的选项卡。

  1. 使用鼠标。 要切换到特定的选项卡,用户可以用鼠标单击它。
  2. 使用键盘箭头。JTabbedPane对象获得焦点时,可以使用键盘箭头从选项卡切换到选项卡。
  3. 使用键盘助记符。 setMnemonicAt方法允许用户使用键盘切换到特定的选项卡。例如,setMnemonicAt(3, KeyEvent.VK_4)将'4'设置为第四个选项卡的助记符(索引为3,因为索引从0开始);按下Alt-4将显示第四个选项卡的组件。通常,助记符使用选项卡标题中的一个字符,然后自动添加下划线。

要以编程方式切换到特定的选项卡,请使用setSelectedIndex方法或setSelectedComponent方法。

选项卡中的首选大小

在构建要添加到选项卡面板的组件时,要记住无论哪个选项卡的子组件可见,每个子组件都会获得相同的空间来显示自己。选项卡面板的首选大小刚好足够显示其最高的子组件的首选高度和最宽的子组件的首选宽度。类似地,选项卡面板的最小大小取决于其所有子组件的最大最小宽度和高度。

TabbedPaneDemo示例中,第四个面板的首选宽度和高度比其他面板大。因此,选项卡面板的首选大小刚好足够显示第四个面板的首选大小。每个面板获得的空间完全相同——在选项卡面板处于首选大小时,宽度为410像素,高度为50像素。如果您不理解如何使用首选大小,请参考布局管理工作原理

带有自定义组件的选项卡

TabComponentsDemo示例介绍了一个选项卡面板,其选项卡包含真实的组件。使用自定义组件可以为选项卡带来按钮、组合框、标签和其他组件等新功能,并允许更复杂的用户交互。

下面是一个带有选项卡上关闭按钮的选项卡面板。

TabComponentsDemo的屏幕截图

试一试: 
  1. 点击“启动”按钮以使用Java™ Web Start运行TabComponentsDemo(下载JDK 7或更高版本)。或者,要自己编译和运行示例,请参考示例索引启动TabComponentsDemo应用程序
  2. 将光标放在一个选项卡上。
  3. 通过点击选项卡来选择一个选项卡(确保不要点击小叉)。
  4. 将光标放在带有小叉的小部件之一上。
    小叉会变成洋红色,并被一个正方形包围。出现与关闭按钮关联的工具提示。
    用鼠标左键点击小叉关闭选项卡。
  5. 通过选择选项菜单中的“Reset JTabbedPane”项来恢复已删除的选项卡。
  6. 注意,具有自定义组件的选项卡显示在原始选项卡面板选项卡的顶部。
    要查看底层的选项卡,请打开选项菜单并清除“Use TabComponents”复选框。
  7. 通过再次选择“Use TabComponents”复选框来显示带有组件的选项卡。
  8. 关闭所有选项卡。现在选项卡面板为空。

删除选项卡

下面的代码从ButtonTabComponent.java中删除选项卡。请注意,必须编写事件处理代码。由于每个选项卡包含一个真正的JButton对象,因此必须将ActionListener附加到关闭按钮上。当用户点击按钮时,actionPerformed方法确定它所属的选项卡的索引,并删除相应的选项卡。

public void actionPerformed(ActionEvent e) {
    int i = pane.indexOfTabComponent(ButtonTabComponent.this);
    if (i != -1) {
    pane.remove(i);
    }
}

为自定义选项卡添加标题

下面的代码来自ButtonTabComponent.java,演示了如何从原始选项卡面板中获取自定义选项卡组件的标题。

JLabel label = new JLabel(title) {
    public String getText() {
        int i = pane.indexOfTabComponent(ButtonTabComponent.this);
        if (i != -1) {
            return pane.getTitleAt(i);
        }
        return null;
    }
};

选项卡面板 API

以下表格列出了常用的JTabbedPane构造函数和方法。使用选项卡面板的 API 可以分为以下几类:

创建和设置选项卡窗格JTabbedPane()
JTabbedPane(int)
JTabbedPane(int, int)SwingConstantsJTabbedPaneTOPBOTTOMLEFTRIGHTJTabbedPaneWRAP_TAB_LAYOUTSCROLL_TAB_LAYOUTaddTab(String, Icon, Component, String)
addTab(String, Icon, Component)
addTab(String, Component)void setTabLayoutPolicy(int)
int getTabLayoutPolicy()WRAP_TAB_LAYOUTSCROLL_TAB_LAYOUTWRAP_TAB_LAYOUTvoid setTabPlacement(int)
int getTabPlacement()SwingConstantsJTabbedPaneTOPBOTTOMLEFTRIGHT
插入、移除、查找和选择选项卡
方法 目的
insertTab(String, Icon, Component, String, int) 在指定的索引处插入一个选项卡,第一个选项卡的索引为0。参数与addTab相同。
remove(Component)
removeTabAt(int)
移除与指定组件或索引对应的选项卡。
removeAll() 移除所有选项卡。
int indexOfComponent(Component)
int indexOfTab(String)
int indexOfTab(Icon)
返回具有指定组件、标题或图标的选项卡的索引。
void setSelectedIndex(int)
void setSelectedComponent(Component)
选择具有指定组件或索引的选项卡。选择选项卡会显示其关联的组件。
int getSelectedIndex()
Component getSelectedComponent()
返回选定选项卡的索引或组件。
更改标签外观void setComponentAt(int, Component)
Component getComponentAt(int)void setTitleAt(int, String)
String getTitleAt(int)void setIconAt(int, Icon)
Icon getIconAt(int)
void setDisabledIconAt(int, Icon)
Icon getDisabledIconAt(int)void setBackgroundAt(int, Color)
Color getBackgroundAt(int)
void setForegroundAt(int, Color)
Color getForegroundAt(int)setForegroundAtvoid setEnabledAt(int, boolean)
boolean isEnabledAt(int)void setMnemonicAt(int, int)
int getMnemonicAt(int)void setDisplayedMnemonicIndexAt(int, int)
int getDisplayedMnemonicIndexAt(int)void setToolTipTextAt(int, String)
String getToolTipTextAt(int)
设置自定义组件在选项卡上
方法 目的
void setTabComponentAt(int, Component) 设置负责渲染选项卡指定参数所指定的标题或图标(或两者都)的组件。当指定空值时,JTabbedPane会渲染标题或图标。同一个组件不能用于多个选项卡。
Component getTabComponentAt(int) 获取指定索引处选项卡的选项卡组件。如果指定的选项卡没有选项卡组件,则返回空值。
int indexOfTabComponent(Component) 检查指定的组件是否属于其中一个选项卡。返回对应选项卡的索引,如果没有这样的选项卡则返回-1。

使用选项卡窗格的示例

此表列出了使用JTabbedPane的示例,并指向这些示例的说明。

示例 说明位置 备注
TabbedPaneDemo 本页面 演示了一些选项卡窗格的功能,如工具提示、图标、可滚动布局和助记符。
TabComponentsDemo 本页面 演示了在选项卡上使用自定义组件。使用带有关闭按钮的选项卡窗格。
BoxAlignmentDemo 使用BoxLayout JTabbedPane作为框架内容面板的唯一子组件。
BorderDemo 使用边框 类似于BoxAlignmentDemo,在其选项卡窗格中使用边框。
DialogDemo 使用对话框 在框架内容面板的中心有一个选项卡窗格,下面有一个标签。

上一页: 如何使用拆分窗格
下一页: 如何使用表格