网格在BorderLayout的中心

时间:2015-04-02 17:20:34

标签: java swing jframe layout-manager grid-layout

我一直试图在死亡中心做一个2x2网格,但我不能。网格将覆盖其余部分或它将适合但我将只能看到最后一个按钮..

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个额外的按钮,但我想删除中心的空间

1 个答案:

答案 0 :(得分:2)

最简单的方法是在主面板上使用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);

编辑:

我们认为你想要按钮的首选尺寸和居中。添加了包装面板以防止按钮改变大小。

如果您希望中心的按钮随着帧大小的变化而增大/缩小,那么您不需要包装器面板:

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