(Java)BorderLayout中的JPanels没有填写我想要的大小

时间:2018-01-31 01:05:13

标签: java swing layout jpanel

我正在尝试制作一个包含三个JPanel的程序。其中两个应占据每个高度的一半并在同一点结束,因此第三个可以占据整个屏幕高度并填充其余的开放空间。 这是我希望它看起来像,大约没有黑色边框: Here's what I want it to look like, approximately, withou

然而,当我尝试对其进行编码时,面板要么占用太多宽度,要么没有填充足够的高度。在将内容添加到内容面板时,我使用了各种BorderLayout限制组合,但没有任何效果。在某些组合中,蓝色和红色是正确的高度,但占据了整个宽度,绿色根本不存在。其他时候,例如我在下面提供的代码,蓝色看起来应该如此,但是红色占据了整个宽度,使得绿色应该是绿色的一半。

JPanel contentPanel = new JPanel(new BorderLayout());
JPanel redPanel = new JPanel();
JPanel greenPanel = new JPanel();
JPanel bluePanel = new JPanel();

//left out background setting lines

//Dimension screenSize defined above, this is a fullscreen program


redPanel.setPreferredSize(new Dimension(screenSize.width-300,screenSize.height/2));

bluePanel.setPreferredSize(new Dimension(screenSize.width - 300,screenSize.height/2));

greenPanel.setPreferredSize(new Dimension(300, screenSize.height));


contentPanel.add(greenPanel, BorderLayout.EAST);
contentPanel.add(bluePanel, BorderLayout.WEST);
contentPanel.add(redPanel, BorderLayout.SOUTH);

以下是这段代码的样子:

enter image description here

我尝试将蓝色的一个添加为北方,将绿色添加为南方,然后改组命令,但没有任何效果。出了什么问题,如何解决?

1 个答案:

答案 0 :(得分:3)

您可能需要复合布局。

首先创建一个布局为GridLayout的容器,添加要拆分的两个组件,然后使用BorderLayout

将其添加到容器的中心

enter image description here

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JPanel center = new JPanel(new GridLayout(2, 1));
                center.add(makePanel(Color.BLUE));
                center.add(makePanel(Color.RED));

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(center);
                frame.add(makePanel(Color.GREEN), BorderLayout.EAST);
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    protected JPanel makePanel(Color background) {
        TestPane panel = new TestPane();
        panel.setBackground(background);
        return panel;
    }

    public class TestPane extends JPanel {

        public TestPane() {
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(200, 100);
        }

    }

}