Herumprobieren mit LayoutManagern: Grauer Bildschirm

Hallo zusammen!

Ich probiere gerade ein bisschen mit LayoutManagern herum, bekomme aber bei folgendem Code nur einen grauen Bildschirm:

public class MainFrame extends JFrame {

	public MainFrame() throws IOException, ClassNotFoundException {
		this.setDefaultCloseOperation(EXIT_ON_CLOSE);
		this.setExtendedState(MAXIMIZED_BOTH);
		this.setUndecorated(true);
		this.setVisible(true);
		
		this.add(new MenuPanel(this), BorderLayout.CENTER);
	}

}
public class MenuPanel extends JPanel {

	public MenuPanel(MainFrame mainFrame) {
		this.setBackground(Color.RED);
		this.setLayout(new GridLayout(3, 3)); /* hier hakt es */
		
		JButton b1 = new JButton("b1");
		
		this.add(b1);
	}

}

Ich habe verschiedene LayoutManager ausprobiert, aber habe immer das gleiche Problem, sobald ich dem MenuPanel einen Button hinzufüge.

Danke schonmal für eure Hilfe!

Ich habe das Problem nun doch noch gelöst.
Ich muss in der Klasse MainFrame pack() aufrufen und zwar an folgender Stelle:

this.add(new MenuPanel(this), BorderLayout.CENTER);
this.pack();
this.setVisible(true);

Dann funktionieren auch alle LayoutManager in der Klasse MenuPanel.

pack() macht es klein, ist kein notwendiger Befehl,

wichtig ist, am Anfang alles vor setVisible(true) hinzuzufügen

Die LayoutManager sind eigentlich so gut dokumentiert (vor allem mit vielen Beispielen) dass man nicht soooo viel “herumprobieren” muss, sondern auch viel “herumspielen” kann: https://docs.oracle.com/javase/tutorial/uiswing/layout/using.html

Es gibt ein paar Caveats, aber nur wenige und kleine. Eine ist, wie schon angedeutet: “setVisible(true)” auf einem Frame ERST DANN aufrufen, wenn alles hinzugefügt wurde.

Ansonsten: Wenn ein Konstruktor einer GUI-Klasse eine IOException und eine ClassNotFoundException wirft, ist das auf mehreren Ebenen schmerzhaft. Weg damit.