Swing VerticalFlowLayout

P

Peterson

Gast
Hallo,
ich will mit Swing eine Liste bauen, in der ich untereinander variabel viele Zeilen habe. Wenn die höhe des Feldes zu klein wird, erscheint ein Scrollbalken.

Die Zeilen sind eigene Panel die ich gestaltet habe. Diese Zeilen sollen immer gleich hoch sein, doch die Breite soll sich daran anpassen, wie groß der Nutzer das Fenster gezogen hat.

Gelöst habe ich es mit einer ScrollPane, die wenn nötig das Scrollen anbietet.
In dem Scrollpane ist eine JPanel, in die ich mit add und remove die Zeilen hinzufüge und lösche.
Damit sie untereinander automatisch kommen aber die Höhe nicht immer komplett ausgefüllt ist (sonst würde bei einer Zeile die Zeile das komplette Fenster sein), habe ich eine Alternative zu einem einspaltigem GridLayout gesucht.

Deshalb habe ich mir im Internet ein VerticalFlowLayout gesucht.
Dies funktioniert auf den ersten Blick genau so, wie ich es wollte. Leider gibt es nur ein Problem: Die Breite der einzelnen Zeilen ist nicht variabel. Das heißt, wenn ich das Fenste groß ziehe bleibt die Zeile "hässlich" klein und umgekehrt passt die Zeile nicht ins Fenster.

Deshalb habe ich weiter gegoogelt aber leider nichts gefunden. Bzw fast nichts: Habe eine Docu zu oracle.javatools.ui.layout.VerticalFlowLayout gefunden, in der es die Methode void setHorizontalFill(boolean hfill) gibt. Das hört sich so an wie das, was ich brauche.
Leider fand ich die Klasse nicht zum runterladen.

Wisst ihr woher ich ein solches VerticalFlowLayout Layout finde, dass das macht, was ich will?
Oder wie würdet ihr das Problem lösen?

Danke
 
T

ThisIsJaavaaaa

Gast
Mach dir ne JscrollPane
setzt ein JPanel rein (Borderlayout)
auf das Panel noch ein JPanel (Gridlayout, in den North)
und dort kommen jetzt deine Zeilen drauf.

Durch das Gridlayout bekommen alle Zeilen die gleiche Größe.
Durch den Trick mit dem extra Panel in den North werden die Zeilen nicht nach Oben / Unten gestreckt)


Java:
			final JScrollPane pane = new JScrollPane();			
			{
				final JPanel help = new JPanel(new BorderLayout());
				{
					final JPanel zeilen = new JPanel(new GridLayout(0, 1, 4, 4));
					// hier kommen jetzt deine Zeilen auf [zeilen]
					// zeilen.add(...)
					help.add(zeilen, BorderLayout.NORTH);
				}
				pane.setViewportView(pane);
			}
 
P

Peterson

Gast
Hallo ThisIsJaavaaaa,
ich habe deinen Tipp probiert.

Die Höhe passt wunderbar, so wie du es auch gesagt hast.
Leider funktioniert auch hier die breite nicht. Das heißt, das Panel das ich als Zeile einfüge ist wieder nur statisch breit. Habe mal geprüft ob es an diesem "Zeilen"-Panel liegt und habe direkt eine Zeile in meine ScrollPane engefügt, also
Java:
JScrollPane scrollPane = new JScrollPane(rowPane);

Da funktioniert die beite wunderbar.
 
T

ThisIsJaavaaaa

Gast
Moin

Das Panel, was dann auf [zeilen] kommt muss auch das richtige Layout haben:
Java:
                    final JPanel zeilen = new JPanel(new GridLayout(0, 1, 4, 4));

                    final JPanel zeile = new JPanel(new BorderLayout());
                    zeile.add(new JButton(), BorderLayout.CENTER);
                   
                    help.add(zeilen, BorderLayout.NORTH);
 
P

Peterson

Gast
Hallo addComponent,
die Zeile ist ein in sich geschlossene Komponente die GroupLayout nutzt. Da nochmal ein Panel rum packen mit Broderlayout hört sich komisch an.
Kann aber gut sein, dass mein ganzes Designe net wirklich gut ist...


Auf jeden Fall Danke für die Tipps.



Hallo bERt0r,
habe mir deinen Link angeschaut. Ich habe GroupLayout nur immer über Google Windowsbuilder hergenommen und habe es nie selbst geschrieben. Deshalb war ich auch überrascht, dass man es als VerticalFlowLayout verwenden kann.
Da ich es öfters brauche habe ich mir nun eine eiegene Klasse für ein Panel mit verticalFlowLayout geschrieben. Diese leitet von JPanel ab und erstell die Gruppierung wie du sie dort vorschlägst.
Zusätzlich hat die Klasse eine neue Methode addComponent, die eine Komponente in die vertikale und horizontale Gruppe steckt.

Funktioniert wunderbar und ich habe für die Zukunft eine eigene Komponente dafür (schöner hätte ich es gefunden wenn ich darin das add überschreiben hätte können, aber leider wird diese von dem GroupLayout genutzt, weshalb ich auf die neue Methode addComponent zurückgreifen musste).

Kleiner Hinweis zu deinem echt schönen Guide:
Unter den Oberpunkt VerticalFlowLayout fehlen im Code Methoden Klammer, es steht nur
ParallelGroup horizontalGroup=layout.createParallelGroup;
da, müsste aber
ParallelGroup horizontalGroup=layout.createParallelGroup();
sein.


Danle für eure Hilfe
 

Neue Themen


Oben