如何使用 CardLayout
Note:
本课涵盖了手工编写布局代码,这可能会很困难。如果您不希望了解布局 管理 的所有详细信息,则可能更喜欢将GroupLayout
布局 管理 器与构建器工具结合使用来布局 GUI。 NetBeans IDE是此类构建器工具之一。否则,如果您想手工编码并且不想使用GroupLayout
,那么推荐使用GridBagLayout
作为下一个最灵活,功能最强大的布局 管理 器。
如果您对使用 JavaFX 创建 GUI 感兴趣,请参阅在 JavaFX 中使用布局。
下图表示使用CardLayout类在两个面板之间切换的应用程序的快照。
单击启动按钮以使用Java™Web 开始(下载 Java SE)运行 CardLayoutDemo。另外,要自己编译和运行示例,请查阅example index。
该演示的完整代码在CardLayoutDemo.java文件中。
CardLayout
类 管理 共享相同显示空间的两个或更多组件(通常是JPanel
实例)。使用CardLayout
类时,让用户使用组合框在组件之间进行选择。 CardLayoutDemo
应用程序是说明此功能的示例。
完成相同任务的另一种方法是使用tabbed pane。下图显示了上述示例的选项卡式窗格版本:
因为选项卡式窗格提供了自己的 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
控制的卡片的容器)。
Method | Purpose |
---|---|
第一(容器父级) | 翻转到容器的第一张卡片。 |
下一个(容器父级) | 翻转到容器的下一张卡片。如果当前可见的卡片是最后一张卡片,则此方法将翻转到布局中的第一张卡片。 |
前一个(容器父级) | 翻转到容器的上一张卡片。如果当前可见的卡是第一张,则此方法将切换到布局中的最后一张卡。 |
最后(容器父级) | 翻转到容器的最后一张卡片。 |
显示(容器父级,字符串 名称) | 使用addLayoutComponent方法翻转到使用指定的name 添加到此布局的组件。 |
使用 CardLayout 的示例
此跟踪中只有一个示例使用CardLayout
,即CardLayoutDemo。通常,我们的示例使用tabbed panes而不是CardLayout
,因为选项卡式窗格提供了自己的 GUI。