我只是想知道是否有办法调整具有CardLayout作为其布局的jpanel。我这里有一张图片,你可以看到我有5个面板。
以下是我的代码段:
JPanel container = new JPanel();
JPanel panel_1 = new JPanel(); // red
JPanel panel_2 = new JPanel(); // violet
JPanel panel_3 = new JPanel(); // violet
JPanel panel_4 = new JPanel(); // blue
FlowLayout flow = new FlowLayout(FlowLayout.RIGHT,1,1);
CardLayout cl = new CardLayout();
这个是我的拳头面板,这是第一个。图3中的。
panel_1 = new JPanel();
panel_1.setBackground(Color.WHITE);
panel_1.setBorder(new EmptyBorder(0, 0, 0, 0));
panel_1.setLayout(flow);
JButton btnGroup1 = new JButton("<html><p align=center>Group<br>01</p></html>");
btnGroup1.setIcon(new ImageIcon("more_buttons\\green.png"));
btnGroup1.setBorderPainted(false);
btnGroup1.setFocusPainted(false);
btnGroup1.setContentAreaFilled(false);
btnGroup1.setHorizontalTextPosition(JButton.CENTER);
btnGroup1.setFont(new Font("Calibri", Font.BOLD, 18));
btnGroup1.setPreferredSize(new Dimension(80, 80));
panel_1.add(btnGroup1);
这是我小组的其余部分。
panel_2 = new JPanel();
panel_2.setBackground(Color.BLUE);
panel_2.setBorder(new EmptyBorder(0, 0, 0, 0));
panel_2.setLayout(flow);
JButton button_2 = new JButton("<html><p align=center> </p></html>");
button_2.setIcon(new ImageIcon("more_buttons\\lightblue.png"));
button_2.setBorderPainted(false);
button_2.setFocusPainted(false);
button_2.setContentAreaFilled(false);
button_2.setHorizontalTextPosition(JButton.CENTER);
button_2.setFont(new Font("Calibri", Font.BOLD, 12));
button_2.setPreferredSize(new Dimension(80, 80));
button_2.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
// TODO Auto-generated method stub
cl.show(container, "4");
}
});
panel_2.add(button_2);
panel_3 = new JPanel();
panel_3.setBackground(Color.WHITE);
panel_3.setBorder(new EmptyBorder(0, 0, 0, 0));
panel_3.setLayout(flow);
JButton button_no_7 = new JButton("7");
button_no_7.setIcon(new ImageIcon("more_buttons\\gray.png"));
button_no_7.setBorderPainted(false);
button_no_7.setFocusPainted(false);
button_no_7.setContentAreaFilled(false);
button_no_7.setHorizontalTextPosition(JButton.CENTER);
button_no_7.setFont(new Font("Calibri", Font.BOLD, 30));
button_no_7.setPreferredSize(new Dimension(80, 80));
panel_3.add(button_no_7);
add(container);
container.add(panel_1, "1");
container.add(panel_2, "2");
container.add(panel_3, "3");
container.add(panel_4, "4");
我要做的是我必须用另一个面板更改上图中的第4个面板,这就是我使用CardLayout的原因,但我得到的只有1,2和3出现。它占据了4和5面板的空间。这就是为什么我想询问是否有任何方式我可以将面板调整为3以便可以看到面板4和5。我知道.setPreferredSize(new Dimension(355,10));因为它被布局管理器覆盖而无法正常工作。那么有谁可以帮助我吗?
答案 0 :(得分:2)
使用CardLayout的关键是面板全部占用相同的空间,一次只能显示一个面板。
如果要显示多个面板,则需要使用不同的布局管理器,在父面板中显示多个子面板。
阅读Using Layout Managers上Swing教程中的部分,了解有关布局管理器的更多信息。然后,您可以使用嵌套面板来实现所需的布局。
此外,您的代码不应使用setPreferredSize()。布局管理器的工作是设置组件的大小/位置。
所以也许你可以从拥有BorderLayout的主面板开始。然后将panel1添加到NORTH,将pan2l2添加到WEST。然后创建另一个添加到CENTER的面板。然后为该面板设置适当的布局,并将面板3,4添加到面板。这是您逻辑嵌套面板以获得所需布局的方式。
答案 1 :(得分:1)
@camickr清楚地说过了。我认为你错误地理解了如何使用CardLayout
。
添加以下行:
panel_4.setLayout(new CardLayout());
并添加要切换到panel_4
的2个面板。我们说它们是A
和B
。
panel_4.add(A, "panelA");
panel_4.add(B, "panelB");
要显示它们,请添加一个按钮以切换。
CardLayout cc = (CardLayout)(panel_4.getLayout());
cc.show(panel_4, "panelA");
此方法的第一个参数是父容器,第二个参数是要显示的面板名称。
在您的代码中,我看到您要让container
显示panel_4
,但是CardLayout
的面板会在所有空间中显示该面板。它无法在左上角显示一个面板,并保持其余部分完好无损。全部或全无。
所以,这一行:
container.add(panel_4, "4");
将在其所有区域显示panel_4。