JFrame Grösse

Hallo.
Ich habe ein JFrame welchem ich mit setSize() die grösse 800x600 gegeben habe.
Wenn ich jetzt ein Jpanel mit den selben maßen dareinsetze, wird es rechts und unten abgeschnitten. Das heisst also
die Titelleiste und die Rahmen aussenrum werden mit in die höhe des Frames einbezogen, oder?
Gibt es da eine elegantere Methode ausser mit getInsets() die ränder auszulesen? Auf setUndecorated will ich auch verzichten.
Also gibt es eine Möglichkeit dem Frame eine Grösse zu geben die sich auf das “innendrin” auswirkt?
Und noch eine Sache: wenn die höhe und breite mit den rändern verrechnet wird, wieso ist der punkt 0x0 des frames dann nicht auch ganz links oben
sondern im “inhalt” links oben?

Vielen Dank!

Du solltest dem contentPane eine preferredSize setzen.

DAs sollte dir weiterhelfen dingdingdingdingding

das beste was du tun kannst ist feste Größenangaben zu vergessen und die Inhalte ihre benötigte Größe selbst berechnen zu lassen.

bye
TT

Bei Frame wäre die Position 0x0 tatsächlich links oben und das ist sicherlich auch vielen auf die Nerven gegangen. JFrame positioniert die Komponenten aber nicht “auf sich”, sondern auf der contentPane und diese ist bereits richtig positioniert, sodass der Inhalt ohne Beachtung der Ränder sofort im Inhalt vorzufinden ist und darum ist 0x0 dann auch links oben im Inhalt und nicht im Rahmen.

Mir fällt so pauschal keine andere Möglichkeit ein, als die Insets zu beachten. Wie gesagt, das war früher mit Frame ohnehin an der Tagesordnung. Also wie dir bereits gesagt wurde, lass die manuelle Größenzuordnung lieber sein und arbeite lieber mit der preferredSize und ruf dann pack() auf, dann kann sich dein JFrame selbst richtig zusammenbauen und du hast den benötigten Platz.

Klingt zwischen den Zeilen ein wenig nach NULL-Layout. wenn dem so ist, bitte auch gleich mit abstellen :slight_smile:

	frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	JPanel panel = new JPanel();
	panel.setPreferredSize(new Dimension(800, 600));
	frame.add(panel);
	frame.pack();
	frame.setVisible(true);
	
	System.out.println(frame.getSize());
	System.out.println(frame.getContentPane().getSize());```

Ja, so ähnlich mach ich das auch. Ich habe in meinen GUIs immer ein MainPanel, dem sich sämtliche anderen Panels (mit LayoutManagern) beteiligten versammeln.

Diesem MainPanel setzte ich dann eine Standardgröße mit mainPanel.setPreferredSize(new Dimension(800, 600)); für den Fall des TO.
Bei mir gibt es keine Klasse, die von JFrame erbt, ich erzeuge immer ein Objekt von JFrame, das ich mir so einstelle, wie ich es brauche.

Am Ende setze ich das MainPanel in den JFrame (1), welcher danach auf die passende Größe, die durch MainPanel vorgegeben wurde, gesetzt (2) und auf dem Bildschirm zentriert (3) und sichtbar gemacht (4) wird:

frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);```

Edit: Also ziemlich genau so, wie das eben von _Michael vor mir gezeigt wurde. :)

Ja es ist das null layout, allerdings ist es für ein 2d spiel.
das soll auch so bleiben. Hier ging es mir nur darum die minX und minY für die map zu berechnen, und ich habe mich gewundert
warum das ganze nicht mit höhe 600 ging, da ich dem frame und dem panel die höhe 600 gegeben habe.

aber ok, ich versuch das mal mit content pane. EIgentlich ist die grösse ja auch egal.