带有JPanel的Boxlayout通过调整大小错误地扩展

时间:2014-12-14 00:21:28

标签: java swing awt layout-manager

我搜索了相当数量,我找不到一个好的,简单的答案来解决这个问题。

我想要一个盒子布局(superPanel),它包含一个上部和下部JPanel(mainPanel和footerPanel)。鞋面将包含更多的JPanels(leftPanel和rightPanel)。

考虑下面的代码,我发现当我调整窗口大小时,mainPanel会变大,页脚也会变大。页脚应始终保持相同的大小,位于主面板下方,框架底部。

frame = new JFrame("Frame");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

                JPanel container = new JPanel();
                container.setLayout(new BoxLayout(container, BoxLayout.Y_AXIS));

        JPanel superPanel = new JPanel();
        JPanel mainPanel = new JPanel();
        JPanel leftPanel = new JPanel();
        JPanel rightPanel= new JPanel();
        JPanel footerPanel = new JPanel();

        footerPanel.setBackground(Color.GREEN);
        mainPanel.setBackground(Color.RED);

        mainPanel.add(leftPanel);
        mainPanel.add(rightPanel);
        mainPanel.setLayout(new FlowLayout(FlowLayout.LEFT));


        leftPanel.add(new JButton("left"));
        rightPanel.add(new JButton("right"));
        footerPanel.add(new JButton("footer"));

        container.add(mainPanel);
        container.add(footerPanel);



        frame.add(container);
        frame.pack();
        frame.setVisible(true);

有人知道为什么会这样吗?如果你运行它,你会发现当窗口调整大小时,红色和绿色都会增大。我想看到的是红色变大,而绿色仍然是相同的大小。

胶水不起作用,我不想使用GridBagLayout,除非我必须(请解释为什么我应该如果需要)

由于

3 个答案:

答案 0 :(得分:0)

尝试使用GridBagLayout,其中fill.BOTH,weightx = 1,weighty = 1表示主面板,fill.NONE,weightx = 0,weighty = 0表示页脚面板或使用Miglayout这真的很简单,有了它,你可以做你想做的一切。

答案 1 :(得分:0)

如果你想要一个不改变大小的“主”部分和侧面部分,你通常需要一个BorderLayout:

container.setLayout(new BorderLayout());

container.add(mainPanel, BorderLayout.CENTER);
container.add(footerPanel, BorderLayout.PAGE_END);

答案 2 :(得分:0)

BorderLayout就是你想要的容器,将mainPanel添加到中心,将footerPanel添加到南方。尝试对代码进行以下更改:

    frame = new JFrame("Frame");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    JPanel container = new JPanel();
    container.setLayout(new BorderLayout());  // Use BorderLayout instead of BoxLayout

    JPanel superPanel = new JPanel();
    JPanel mainPanel = new JPanel();
    JPanel leftPanel = new JPanel();
    JPanel rightPanel = new JPanel();
    JPanel footerPanel = new JPanel();

    footerPanel.setBackground(Color.GREEN);
    mainPanel.setBackground(Color.RED);

    mainPanel.add(leftPanel);
    mainPanel.add(rightPanel);
    mainPanel.setLayout(new FlowLayout(FlowLayout.LEFT));

    leftPanel.add(new JButton("left"));
    rightPanel.add(new JButton("right"));
    footerPanel.add(new JButton("footer"));

    container.add(mainPanel, BorderLayout.CENTER);    // Add mainPanel to the central area
    container.add(footerPanel, BorderLayout.SOUTH);   // Add footePanel to the bottom

    frame.add(container);
    frame.pack();
    frame.setVisible(true);

BorderLayout确定添加到CENTER区域的组件将水平和垂直展开以跟随容器。 SOUTH区域只能水平扩展,而EAST和WEST只能垂直扩展。请记住,每个布局管理器类都有自己的规则,如何在组件之间划分容器空间以及如何调整它们的大小。