【问题标题】:More than 2 Visible JPanels in a CardLayoutCardLayout 中有超过 2 个可见的 JPanel
【发布时间】:2015-06-08 07:24:04
【问题描述】:

我在将两个以上的 JPanel 对象放入 CardLayout 同时可见时遇到问题。虽然我可以放置多个面板,但它们不会同时出现,我无法根据需要调整它们的大小。为了更清楚地了解我想要什么,我添加了一张测试图片。

【问题讨论】:

  • 创建一个 jpanel 并将它的布局设置为类似网格的东西并添加 2 个子 jpanel 到它,然后将主面板添加到卡片布局
  • 我可以手动设置子JPanel的大小吗?
  • 是的。您可以通过使用适当的布局来控制子面板的大小。如果您选择网格布局,那么两个子面板的大小将相同。
  • 是的,没关系。但是我可以将 1 个面板的大小设置为 1/4,其余的设置为另一个吗?
  • @是的,你可以,但你是在谈论侧边栏和正文内容可更改为面板 1 和面板 2 吗?侧边栏和页眉不应该在卡片布局内。我告诉的是如果你想让 2 个面板不是单一的bodycontentchangable 面板,那么您应该在 bodycontentchangable 面板上设置适当的布局并向其添加 2 个子面板

标签: java swing jpanel layout-manager cardlayout


【解决方案1】:

在这种情况下,您可以使用带有BorderLayout 的面板作为常量和卡片的容器,然后使用带有CardLayout 的卡片(JPanel)。这是一个简单的例子:

import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Color;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class TestFrame extends JFrame {

    public static void main(String... s) {
        new TestFrame();
    }

    public TestFrame() {
        init();
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        pack();
        setLocationRelativeTo(null);
        setVisible(true);
    }


    private void init() {
        setLayout(new BorderLayout());

        JLabel head = new JLabel("Header");
        head.setBorder(BorderFactory.createLineBorder(Color.BLACK));

        JLabel side = new JLabel("SideBar");
        side.setBorder(BorderFactory.createLineBorder(Color.BLACK));

        JPanel changable = getPanel();
        changable.setBorder(BorderFactory.createLineBorder(Color.BLACK));

        add(head,BorderLayout.NORTH);
        add(side,BorderLayout.WEST);
        add(changable,BorderLayout.CENTER);
    }


    private JPanel getPanel() {
        final CardLayout cards = new CardLayout(5,5);
        final JPanel p = new JPanel(cards);
        p.add(new JLabel("1"), "1");
        p.add(new JLabel("2"), "2");

        p.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                super.mouseClicked(e);
                cards.next(p);
            }
        });

        return p;
    }

}

【讨论】:

  • 谢谢。有相当多的想法。现在更清楚了。 +1 并接受
猜你喜欢
  • 2014-05-12
  • 2013-04-13
  • 2012-10-21
  • 1970-01-01
  • 2023-03-26
  • 2013-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多