(Java)BorderLayout中的JPanel是';我不能填上我想要的尺码

(Java)BorderLayout中的JPanel是';我不能填上我想要的尺码,java,swing,layout,jpanel,Java,Swing,Layout,Jpanel,我想用三个JPanel做一个程序。其中两个应该占据一半的高度,并在同一点结束,因此第三个可以占据整个屏幕高度,并填充其余的开放空间。 下面是我希望它看起来的样子,大约没有黑色边框: 然而,当我试图编写代码时,面板要么占用了太多的宽度,要么填充的高度不够。当我将边界布局限制添加到内容面板时,我使用了各种边界布局限制的组合,但没有任何效果。在某些组合中,蓝色和红色是正确的高度,但占据了整个宽度,而绿色根本不存在。其他时候,比如我将在下面提供的代码中,蓝色看起来应该是这样的,但红色占据了整个宽度,使

我想用三个JPanel做一个程序。其中两个应该占据一半的高度,并在同一点结束,因此第三个可以占据整个屏幕高度,并填充其余的开放空间。 下面是我希望它看起来的样子,大约没有黑色边框:

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

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);
下面是代码的外观:


我试着把蓝色的加在北面,绿色的加在南面,然后重新排列顺序,但没有效果。出什么事了,我该怎么解决它?

您可能需要一个复合布局

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


您可能需要一个复合布局

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


中心容器应使用
网格布局设置
中心容器应使用
网格布局设置
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);
        }

    }

}