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
.
我想创建一个带有 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 aPanel
that hasBorderLayout
layout manager。 Choice
不支持ActionListener
,支持ItemListener
。因此上面的代码实现了ItemListener
.