The following bit of code does what you ask for. Just make sure that you assign enough space so that the text on the button becomes visible
JFrame frame = new JFrame("test"); frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); JPanel panel = new JPanel(new GridLayout(4,4,4,4)); for(int i=0 ; i<16 ; i++){ JButton btn = new JButton(String.valueOf(i)); btn.setPreferredSize(new Dimension(40, 40)); panel.add(btn); } frame.setContentPane(panel); frame.pack(); frame.setVisible(true);
The X and Y (two first parameters of the GridLayout constructor) specify the number of rows and columns in the grid (respectively). You may leave one of them as 0 if you want that value to be unbounded.
Edit
I’ve modified the provided code and I believe it now conforms to what is desired:
JFrame frame = new JFrame("Colored Trails"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel mainPanel = new JPanel(); mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.Y_AXIS)); JPanel firstPanel = new JPanel(); firstPanel.setLayout(new GridLayout(4, 4)); firstPanel.setMaximumSize(new Dimension(400, 400)); JButton btn; for (int i=1; i<=4; i++) { for (int j=1; j<=4; j++) { btn = new JButton(); btn.setPreferredSize(new Dimension(100, 100)); firstPanel.add(btn); } } JPanel secondPanel = new JPanel(); secondPanel.setLayout(new GridLayout(5, 13)); secondPanel.setMaximumSize(new Dimension(520, 200)); for (int i=1; i<=5; i++) { for (int j=1; j<=13; j++) { btn = new JButton(); btn.setPreferredSize(new Dimension(40, 40)); secondPanel.add(btn); } } mainPanel.add(firstPanel); mainPanel.add(secondPanel); frame.setContentPane(mainPanel); frame.setSize(520,600); frame.setMinimumSize(new Dimension(520,600)); frame.setVisible(true);
Basically I now set the preferred size of the panels and a minimum size for the frame.