BorderLayout 中心的网格

Grid in the center of BorderLayout

我一直试图在它的死点制作一个 2x2 的网格,但我 cant.either 网格将覆盖其余部分或者它会适合但我只能看到最后一个按钮..

import javax.swing.*;
import java.awt.*;

public class Buttons extends JFrame
{

    public static void main(String[] args) 
    {
        JFrame frame = new JFrame();
        frame.setTitle("Example 1");
        frame.setSize(400,200);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        frame.setLayout(new BorderLayout());

        JButton b1 = new JButton("TOP");
        JButton b2 = new JButton("LEFT");
        JButton b3 = new JButton("RIGHT");
        JButton b4 = new JButton("BOTTOM");

        frame.add(b1, BorderLayout.PAGE_START);
        frame.add(b2, BorderLayout.LINE_START);
        frame.add(b3, BorderLayout.LINE_END);
        frame.add(b4, BorderLayout.PAGE_END);



        JPanel grid = new JPanel( new GridLayout(0, 2) );
        JPanel wrapper = new JPanel();
        wrapper.add( grid );    
        frame.add(wrapper, BorderLayout.CENTER);

        JButton bb1 = new JButton("1");
        JButton bb2 = new JButton("2");
        JButton bb3 = new JButton("3");
        JButton bb4 = new JButton("4");


        grid.add( bb1 );
        grid.add( bb2 );
        grid.add( bb3 );
        grid.add( bb4 );  

        frame.setVisible(true);       

    }
    private JPanel frame;
    private JButton b1,b2,b3,b4,bb1,bb2,bb3,bb4;
}

添加了 4 个额外的按钮,但我想删除中间的 space

最简单的方法是在主面板上使用 GridBagLayout,在子面板上使用 GridLayout:

JPanel grid = new JPanel( new GridLayout(0, 2) );
grid.add( b1 );
grid.add( b2 );
grid.add( b3 );
grid.add( b4 );

frame.setLayout( new GridBagLayout() );
frame.add(grid, new GridBagConstraints());

另一种方法是使用 BorderLayout,但是您将需要一个包装面板,这样网格面板就不会变大:

JPanel grid = new JPanel( new GridLayout(0, 2) );
grid.add( b1 );
grid.add( b2 );
grid.add( b3 );
grid.add( b4 );

JPanel wrapper = new JPanel();
wrapper.add( grid );    
frame.add(wrapper, BorderLayout.CENTER);

编辑:

我们认为您希望按钮具有首选大小并居中。添加了包装器面板以防止按钮更改大小。

如果您希望中心的按钮随着框架大小的变化而变为 grow/shrink,则不需要包装面板:

 //frame.add(wrapper, BorderLayout.CENTER);
 frame.add(grid, BorderLayout.CENTER);