我在Swing中设计GUI。我想要我的gui的特定区域 - 中心视图 - 能够更改其显示以响应动作事件。无论显示什么内容,中心视图的大小都不得改变。
现在,如果我的JPanel
panel1
具有优先级并将其放入panel2
而没有任何指定的大小,则panel2将完全按照panel1的显示;你甚至看不到双JPanel
层。但由于我的中心框架(panel2)不应该改变大小,我尝试将panel2设置为特定大小并给它BorderLayout
。现在,如果我调用panel2.add(panel1,
BorderLayout.center )
,其中panel1与panel2具有完全相同的尺寸,则会显示双JPanel
图层,并且中心视图显示为错误。
如何将panel1添加到panel2,其中两个都具有相同的尺寸,因此panel2不可见?或者更好的是,我该怎么做呢? (简单LayoutManagers
)
答案 0 :(得分:4)
我会回答这个问题,因为这是对这个问题的规范回答:
使用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();
}
});
}
}