如何使用 CardLayout

Note:

本课涵盖了手工编写布局代码,这可能会很困难。如果您不希望了解布局 管理 的所有详细信息,则可能更喜欢将GroupLayout布局 管理 器与构建器工具结合使用来布局 GUI。 NetBeans IDE是此类构建器工具之一。否则,如果您想手工编码并且不想使用GroupLayout,那么推荐使用GridBagLayout作为下一个最灵活,功能最强大的布局 管理 器。

如果您对使用 JavaFX 创建 GUI 感兴趣,请参阅在 JavaFX 中使用布局

下图表示使用CardLayout类在两个面板之间切换的应用程序的快照。

CardLayoutDemo 的快照

CardLayoutDemo 的另一个快照

单击启动按钮以使用Java™Web 开始(下载 Java SE)运行 CardLayoutDemo。另外,要自己编译和运行示例,请查阅example index

该演示的完整代码在CardLayoutDemo.java文件中。

CardLayout类 管理 共享相同显示空间的两个或更多组件(通常是JPanel实例)。使用CardLayout类时,让用户使用组合框在组件之间进行选择。 CardLayoutDemo应用程序是说明此功能的示例。

完成相同任务的另一种方法是使用tabbed pane。下图显示了上述示例的选项卡式窗格版本:

TabDemo 的快照

因为选项卡式窗格提供了自己的 GUI,所以使用选项卡式窗格比使用CardLayout类更简单。例如,使用选项卡式窗格实现前面的示例将导致程序中的代码行更少。

单击启动按钮以使用Java™Web 开始(下载 JDK 7 或更高版本)运行 TabDemo。另外,要自己编译和运行示例,请查阅example index

该演示的完整代码在TabDemo.java文件中。

从概念上讲,CardLayout管理 的每个组件都像扑克牌或堆叠中的 Transaction 卡,其中在任何时候都只有顶部的卡可见。您可以选择通过以下任意一种方式显示的即时贴:

  • 通过询问第一张或最后一张卡,按照添加到容器中的 Sequences

  • 通过向后或向前翻转甲板

  • 通过指定具有特定名称的卡

CardLayoutDemo类使用最后一个方案。

CardLayoutDemo.java应用程序中的以下代码段创建了CardLayout对象及其 管理 的组件。

//Where instance variables are declared:
JPanel cards;
final static String BUTTONPANEL = "Card with JButtons";
final static String TEXTPANEL = "Card with JTextField";

//Where the components controlled by the CardLayout are initialized:
//Create the "cards".
JPanel card1 = new JPanel();
...
JPanel card2 = new JPanel();
...

//Create the panel that contains the "cards".
cards = new JPanel(new CardLayout());
cards.add(card1, BUTTONPANEL);
cards.add(card2, TEXTPANEL);

要将组件添加到CardLayout对象 管理 的容器中,请指定标识要添加的组件的字符串。例如,在此演示中,第一个面板的字符串 为"Card with JButtons",第二个面板的字符串 为"Card with JTextField"。在此演示中,这些字符串 也用在组合框中。

要选择CardLayout对象显示的组件,请在代码示例中添加其他代码:

//Where the GUI is assembled:
//Put the JComboBox in a JPanel to get a nicer look.
JPanel comboBoxPane = new JPanel(); //use FlowLayout
String comboBoxItems[] = { BUTTONPANEL, TEXTPANEL };
JComboBox cb = new JComboBox(comboBoxItems);
cb.setEditable(false);
cb.addItemListener(this);
comboBoxPane.add(cb);
...
pane.add(comboBoxPane, BorderLayout.PAGE_START);
pane.add(cards, BorderLayout.CENTER);
...

//Method came from the ItemListener class implementation,
//contains functionality to process the combo box item selecting
public void itemStateChanged(ItemEvent evt) {
    CardLayout cl = (CardLayout)(cards.getLayout());
    cl.show(cards, (String)evt.getItem());
}

本示例说明,要使用CardLayout类的show方法,必须设置当前可见的组件。 show方法中的第一个参数是CardLayout控制的容器,即CardLayout管理 的组件的容器。第二个参数是标识要显示的组件的字符串。该字符串 与将组件添加到容器时使用的字符串 相同。

CardLayout API

下表列出了用于选择组件的CardLayout类方法。对于每种方法,第一个参数是CardLayout作为布局 管理 器的容器(CardLayout控制的卡片的容器)。

MethodPurpose
第一(容器父级)翻转到容器的第一张卡片。
下一个(容器父级)翻转到容器的下一张卡片。如果当前可见的卡片是最后一张卡片,则此方法将翻转到布局中的第一张卡片。
前一个(容器父级)翻转到容器的上一张卡片。如果当前可见的卡是第一张,则此方法将切换到布局中的最后一张卡。
最后(容器父级)翻转到容器的最后一张卡片。
显示(容器父级,字符串 名称)使用addLayoutComponent方法翻转到使用指定的name添加到此布局的组件。

使用 CardLayout 的示例

此跟踪中只有一个示例使用CardLayout,即CardLayoutDemo。通常,我们的示例使用tabbed panes而不是CardLayout,因为选项卡式窗格提供了自己的 GUI。