如何使用CardLayout调整JPanel的大小

时间:2014-06-25 15:51:33

标签: java css swing layout-manager cardlayout

我只是想知道是否有办法调整具有CardLayout作为其布局的jpanel。我这里有一张图片,你可以看到我有5个面板。

enter image description here

以下是我的代码段:

    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));因为它被布局管理器覆盖而无法正常工作。那么有谁可以帮助我吗?

2 个答案:

答案 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个面板。我们说它们是AB

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。