PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Java: Panel im Frame zentrieren


RattuS
2011-02-14, 19:25:39
Hallo,

ich komme mit dem LayoutManagement bei Java noch nicht so ganz zurecht. Ich habe ein JFrame, das eine JMenu hat. Im Zentrum des ContentPane des JFrame möchte ich ein JPanel platzieren, das genau in seiner eigenen größe dargestellt werden soll. Das JPanel muss soll auch beim Verändern der JFrame-Größe zentriert bleiben.

Mein Ansatz mit BorderLayout:
this.setSize(800, 500);
this.getContentPane().setLayout(new BorderLayout());
...
setJMenuBar(myMenu);
...
JPanel myPanel = new JPanel();
myPanel.setSize(640, 400);
myPanel.setBackground(Color.BLACK);
this.getContentPane().add(myPanel, BorderLayout.CENTER);
Bringt nichts, weil BorderLayout das JPanel auf das gesamte ContentPane vergrößert.

Mein Ansatz mit GridBagLayout:
this.setSize(800, 500);
this.getContentPane().setLayout(new GridBagLayout());
...
setJMenuBar(myMenu);
...
JPanel myPanel = new JPanel();
myPanel.setSize(640, 400);
myPanel.setBackground(Color.BLACK);
this.getContentPane().add(myPanel, new GridBagConstraints());
Zentriert zwar das Panel, setzt aber die Größe nicht oder nicht richtig. Hab da nur ein ca. 24x24px kleines schwarzes Panel. >_>

Gast
2011-02-14, 20:16:01
Du musst die GridBagConstraints (http://download.oracle.com/javase/1.4.2/docs/api/java/awt/GridBagConstraints.html) auch noch spezifizieren. Weiss aber nicht mehr genau, was da alles erforderlich ist.

Versteh ich das richtig, dass beim Vergrössern des JFrames das JPanel nicht mitskalieren soll?

RattuS
2011-02-14, 20:27:52
Du musst die GridBagConstraints (http://download.oracle.com/javase/1.4.2/docs/api/java/awt/GridBagConstraints.html) auch noch spezifizieren. Weiss aber nicht mehr genau, was da alles erforderlich ist.

Versteh ich das richtig, dass beim Vergrössern des JFrames das JPanel nicht mitskalieren soll?
GridBagConstraints wird beim Standardkonstruktur schon auf CENTER gesetzt.

Nein, JPanel soll sich samt JFrame anpassen.

Gast
2011-02-14, 20:40:44
Den Ansatz mit BorderLayout finde ich passender, würde dabei bleiben.

Was ich versuchen würde (bin kein GUI-Spezi):
- neben setSize() gibts noch setMinimumSize() und setMaximumSize(), vll musst du alle 3 Methoden verwenden. Der Vollständigkeit halber noch setPreferredSize()
- kann man bei Panels setResizable(false) machen? Evtl. hilft das.
- falls das nicht hilft musst du noch Dummy-Komponenten nach NORTH, SOUTH, EAST, WEST packen. Kann ich jetzt aber auch nicht genauer sagen, müsste ich jetzt auch die Reference durchblättern.

RattuS
2011-02-14, 20:51:43
BorderLayout maximiert den Komponent scheinbar immer. setMinimumSize/setMaximumSize/setPreferredSize ändern nichts daran. JPanel hat leider kein setResizable.

Die Idee mit den Dummies ist nicht schlecht, aber ich bekomme den Source-Code berwertet und da möchte ich ungern ein Workaround präsentieren.

Edit: Das mit dem BorderLayout ist irgendwie auch Mist, denn der vergrößert selbst mit den Dummies das JPanel.
Wenn ich den LayoutManager auf null setze, zentriert er das JPanel auf seine beabsichtigte Größe. Leider gibt es keine Repositionierung bei Veränderung des JFrame. Kann ich das auch selbst übernehmen ohne einen LayoutManager schreiben zu müssen?

Edit²: Habs gefunden: componentResized im ComponentListener. Somit kann ich den LayoutManager komplett ignorieren.

Trap
2011-02-14, 22:47:13
Probier mal http://www.miglayout.com/, das ist meistens weniger umständlich zum gewünschten Layout zu überreden.