Java 使用 Choice 的卡片布局

Java Card Layouts using Choice

我想创建一个带有 GUI 的程序,其中我有 Choice 三个不同的选项。

我必须用 CardLayout 实现它,但我的问题是我不知道如何将 CardLayoutPanel 切换到我在 Choice 中选择的那个。

Choice ch       = new Choice();
Panel cl        = new Panel(new CardLayout());

Panel one       = new Panel();
Panel two       = new Panel();
Panel three     = new Panel();

在构造函数中我有:

// CARD LAYOUT PANELS
cl.add(one, "1");
cl.add(two, "2");
cl.add(three, "3");

f.setLayout(new FlowLayout());

// CHOICE-OPTIONS
ch.add("one");
ch.add("two");
ch.add("three");

如何添加 ActionListener 以使用 Choice 在不同的 Panel 之间切换?

(请不要评论google-我已经评论了,否则我不会问)

谢谢!

这是一个 SSCCE(简短的自包含正确示例)。代码后的注释。

import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Choice;
import java.awt.EventQueue;
import java.awt.Frame;
import java.awt.Label;
import java.awt.Panel;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class AwtTest0 extends WindowAdapter implements ItemListener {
    private Frame  frame;
    private Panel  cards;

    public void itemStateChanged(ItemEvent event) {
        CardLayout layout = (CardLayout) cards.getLayout();
        if (event.getStateChange() == ItemEvent.SELECTED) {
            Object obj = event.getItem();
            String name = obj.toString();
            layout.show(cards, name);
        }
    }

    public void windowClosing(WindowEvent event) {
        System.exit(0);
    }

    private Panel createCard(String text) {
        Panel card = new Panel();
        Label label = new Label(text);
        card.add(label);
        return card;
    }

    private Panel createCards() {
        cards = new Panel(new CardLayout());
        cards.add(createCard("1"), "one");
        cards.add(createCard("2"), "two");
        cards.add(createCard("3"), "three");
        return cards;
    }

    private Panel createChoice() {
        Panel panel = new Panel();
        Choice ch = new Choice();
        ch.add("one");
        ch.add("two");
        ch.add("three");
        ch.addItemListener(this);
        panel.add(ch);
        return panel;
    }

    private void showGui() {
        frame = new Frame();
        frame.addWindowListener(this);
        frame.add(createChoice(), BorderLayout.PAGE_START);
        frame.add(createCards(), BorderLayout.CENTER);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        final AwtTest0 instance = new AwtTest0();
        EventQueue.invokeLater(() -> instance.showGui());
    }
}
  • 在方法 main 中,我调用了方法 invokeLater,它显式启动了 EDT(事件调度线程)。 GUI 必须在此线程上 运行。
  • 为了在您单击 关闭 window 按钮(通常是 X 在window), 你加一个WindowListener.
  • 当您将组件添加到 Frame 时,您实际上是在将它们添加到 content pane which is a Panel that has BorderLayout layout manager
  • Choice不支持ActionListener,支持ItemListener。因此上面的代码实现了 ItemListener.