Swing Inhalt eines Fenster bei Größenänderung anpassen (GroupLayout)

SaschaU

Mitglied
Hallo zusammen,

ich habe gerade schon alles durchsucht und auch Google bemüht, aber leider nichts passendes gefunden.
Ich will erst einmal beschreiben, wie meine App aufgebaut ist:

Da ich sonst Eclipse benutze, aber mir für GUI-Apps NetBeans empfohlen wurde, habe ich es einfach mal damit probiert. Ich bin damit eigentlich super zufrieden, aber nun...
Ich habe einen JFrame, auf dem ein JPanel liegt, das wiederum einen JTree und eine JList beherbergt. Das Ganze habe ich mit NetBeans gemacht, daher ist das Ganze mit dem GroupLayout (auch das Panel) hinterlegt und daher kann ich auch nicht ohne Probleme das Layout wechseln. Das Gleiche gilt natürlich dann auch für den restlichen Code, der von NetBeans automatisch schreibgeschützt wird (incl. dem "pack()") - Den Code hier zu posten ist ein bisschen viel denke ich...

Mein Problem ist jetzt, dass ich möchte, dass sich der Inhalt des Frames (also das Panel, der Tree und die List) dynamisch in der Größe ändert, wenn ich die Größe des Frames ändere. Also, wenn ich den Frame z.B. kleiner ziehe, dann soll der Inhalt im gleichen Abstand zum Rand des Frames ebenfalls keliner werden.

Ist das irgendwie möglich; ich werde noch wahnsinnig...;( Es kann natürlich auch sein, dass ich schon zulange über dieses Problem nachgrüble und daher den Wald vor lauter Bäumen nicht mehr sehe...

Gruß, Sascha
 
Ich glaube, ich hab es selber herausgefunden! Das GroupLayout ist doch etwas verworrener, als zuerst angenommen (vor allem die NetBeans-Variante mit äußerst verschachteltem Code)...
Das Problem hierbei ist auch mal wieder, dass man den Code, den NetBeans selber generiert, nicht ändern kann und daher nur schwer herauszufinden ist, wo das Problem liegt, da man nur wenig "spielen" kann und der Code nur schwer zu verstehen ist... (ich hoffe, ich bekomme es verständlich formuliert)

So gehts (als Beispiel habe ich hier nur die vertikale Gruppe genommen - äquivalent gehts auch bei der horizontalen):
Java:
layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(18, 18, 18)
                .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addContainerGap())
        );

... und so nicht:
Java:
layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(18, 18, 18)
                .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

Grob vereinfacht heißt das also, dass man also beim hinzufügen des Panels zur sequentiellen (vertikalen wie auch horizontalen) Gruppe als minimale Größe nur den Wert "DEFAULT_SIZE" geben darf und den Container-Gap nichts mitgeben darf, so dass der Gap nicht resizable ist (Paradox... - Scully? Mulder?)!

In der Methoden-Beschreibung der API sieht das Ganze so aus:
Java:
public GroupLayout.SequentialGroup addComponent(Component component, int min, int pref, int max)

Oh mann, da soll man da noch durchblicken...:bahnhof:
 
Hallo,

wenn du ganz bestimmte Vorstellungen der Benutzeroberfläche bezüglich des Verhaltens bei Größenänderungen hast, solltest du die Erstellung händisch vornehmen.
Auch wird so kein unnötiger oder kompliziert verschachtelter Code erzeugt.

Nichts gegen das Zusammenklicken der GUI - das ist schon eine feine Sache.

Jeder LayoutManager hat so seine eigenen Besonderheiten und Eigenarten. Man muß sich im Vorfeld schon gut überlegen, was man haben will, um den oder die richtigen LayoutManager auszuwählen.

Der GroupLayoutManager ist eine komplizierte Sache. Man kann aber damit nette Effekte erzielen. Ich benutze ihn meistens, wenn ich eine aufwendige Benutzeroberfläche habe, bei der ich bestimmte Elemente dynamisch ein- und ausblenden will.
Sicher bist du schon auf diese beiden Seiten gestoßen:
How to Use GroupLayout (The Java™ Tutorials > Creating a GUI With JFC/Swing > Laying Out Components Within a Container)
A GroupLayout Example (The Java™ Tutorials > Creating a GUI With JFC/Swing > Laying Out Components Within a Container)

MfG
hansmueller
 

Zurück
Oben