gpt4 book ai didi

java - 如何正确使用 JPanel 作为其他几个 JPanel 的容器?

转载 作者:行者123 更新时间:2023-11-29 03:22:47 27 4
gpt4 key购买 nike

我正在使用 Swing 设计 GUI。我希望我的 gui 的特定区域 - 中心 View - 能够更改其显示以响应 Action 事件。无论显示什么内容,中心 View 的大小都不得改变。

现在,当我有一个具有预设大小的 JPanel panel1 并将其放入没有任何指定大小的 panel2 时,panel2 将完全显示为小组 1 会;您甚至看不到双 JPanel 层。但由于我的中心框架 (panel2) 不应改变大小,我尝试将 panel2 设置为特定大小并为其指定一个 BorderLayout。现在,如果我调用 panel2.add(panel1,BorderLayout.center),其中 panel1 的尺寸与 panel2 完全相同,则双 JPanel 层是可见,中心 View 显示不好。

如何将 panel1 添加到 panel2,两者具有相同的尺寸,因此 panel2 不可见?或者更好的是,我应该怎么做? (使用简单的 LayoutManagers)

最佳答案

我会把它作为一个答案,因为它是这个问题的规范答案:

使用 CardLayout。你可以找到教程 here . CardLayout 非常适合确保中心 JPanel(持卡人 JPanel)不会更改大小。您可以从几乎任何控制结构交换卡片,无论是 JButton 持有的 ActionListener 还是来自 JComboBox。

例如:

import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import javax.swing.*;

@SuppressWarnings("serial")
public class CardExample extends JPanel {
enum MyColor {
RED("Red", Color.RED), YELLOW("Yellow", Color.YELLOW), BLUE("Blue",
Color.BLUE);
private String name;
private Color color;

private MyColor(String name, Color color) {
this.name = name;
this.color = color;
}

public String getName() {
return name;
}

public Color getColor() {
return color;
}
}

private static final int GAP = 3;

private CardLayout cardlayout = new CardLayout();
private JPanel cardHolderPanel = new JPanel(cardlayout);

public CardExample() {
JPanel btnPanel = new JPanel(new GridLayout(1, 0, GAP, GAP));
for (MyColor myColor : MyColor.values()) {
JPanel cardPanel = new JPanel();
cardPanel.setPreferredSize(new Dimension(200, 200));
cardPanel.setBackground(myColor.getColor());
cardHolderPanel.add(cardPanel, myColor.getName());

btnPanel.add(new JButton(new ButtonAction(myColor)));
}

setLayout(new BorderLayout(GAP, GAP));
setBorder(BorderFactory.createEmptyBorder(GAP, GAP, GAP, GAP));
add(cardHolderPanel, BorderLayout.CENTER);
add(btnPanel, BorderLayout.SOUTH);
}

private class ButtonAction extends AbstractAction {
private MyColor myColor;

public ButtonAction(MyColor myColor) {
super(myColor.getName());
this.myColor = myColor;
}

@Override
public void actionPerformed(ActionEvent e) {
cardlayout.show(cardHolderPanel, myColor.getName());
}
}

private static void createAndShowGui() {
JFrame frame = new JFrame("CardExample");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(new CardExample());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}

public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}

关于java - 如何正确使用 JPanel 作为其他几个 JPanel 的容器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22674163/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com