Flowlayout in Flowlayout - Dynamisch?

Angiii

Erfahrenes Mitglied
Hallo,

habe ein kleines Problem mit dem Flowlayout. Bin mir nicht sicher ob es einfach ein Denkfehler ist oder ob ich das Ganze prinzipiell zu einfach sehe.


Ich habe ein JPanel (Flowlayout) in dem ich weitere JPanels für bestimmte Abteilungen hinzufüge. Die Abteilungs-Panels sind ebenfalls im Flowlayout und enthalten die einzelnen Arbeitsplätze von Mitarbeitern. Die Abteilungs-Panels lassen sich auf- und zuklappen. Ziel ist, dass sich die einzelnene Mitarbeiter sauber vertikal durchscrollen lassen und alles möglichst kompakt ist. Ich habe zwei Bilder angefügt, welche die Situation wohl besser beschreiben.


Im Moment hab ich alles noch mit einem BorderLayout verbunden. Jedoch passt sich die Größe der JPanels nicht so an wie ich mir das in den Bilder vorstelle. Was fehlt mir, um das Ganze Konstrukt dynamischer zu gestalten? Habe schon mit "setPreferedSize" experimentiert. Aber sobald ich die Fenstergröße mit der Maus ändere, stimmen die dort eingetragenen Maße nicht mehr mit der Realität überein.

Vielleicht hat ja jemand einen Tipp! Danke******

Code:
	private JPanel getJPanel() {
		if (jPanel == null) {
			jPanel = new JPanel();
			jPanel.setLayout(new FlowLayout(FlowLayout.LEFT));
			jPanel.setLayout(new BorderLayout());
//			jPanel.setLayout(new BoxLayout(getJPanel(), BoxLayout.Y_AXIS));


			jPanel.add(getGroupStorage(), BorderLayout.NORTH);
			jPanel.add(getGroupLogistic(), BorderLayout.CENTER);
			jPanel.add(getGroupDefault(), BorderLayout.SOUTH);


			jPanel.addComponentListener(new java.awt.event.ComponentAdapter() {
				public void componentResized(java.awt.event.ComponentEvent e) {
					System.out.println("componentResized()" + getSize()); 
		
					groupLogistic.repaint();
					groupLogistic.validate();
				}
			});
		}
		return jPanel;
	}


Code:
	private JPanel getGroupLogistic() {
		if (groupLogistic == null) {
			groupLogistic = new JPanel();
		
			groupLogistic.setBorder(BorderFactory.createTitledBorder(null, 
					"Logistic dep.", 
					TitledBorder.DEFAULT_JUSTIFICATION, 
					TitledBorder.DEFAULT_POSITION, 
					myFont, 
					myColor));
				
			groupLogistic.add(newDevice( icon, "5 devices"), null);
			
		
			groupLogistic.add(ex1, null);
			groupLogistic.add(ex2, null);
			groupLogistic.add(ex3, null);
			groupLogistic.add(ex4, null);
			groupLogistic.add(ex5, null);
			groupLogistic.setLayout(new FlowLayout(FlowLayout.LEFT, 30, 30));

			   groupLogistic.setBackground(Color.white);
		}
		return groupLogistic;
	}
 

Anhänge

  • crocdog.png
    crocdog.png
    40,8 KB · Aufrufe: 18
  • crocdog2.png
    crocdog2.png
    28,6 KB · Aufrufe: 12
Ich denke mal du meinst auf dem ersten Bild eher, dass die Krokos in eine neue Zeile sollen, damit keine horizontale Scrollbar auftaucht. Brauchst du die ScrollPane eigentlich unbedingt oder gehts auch ohne? Weil ohne ScrollPane macht das FlowLayout was es soll. Andernfalls musst du halt bei dem entsprechenden Panel (in diesem Fall groupLogistic) mit setPreferedSize() dafür sorgen.

Das zweite Bild versteh ich allerdings nicht so ganz. Laut dem Bild soll das untere Panel dann eine Stufe nach oben in den leeren Platz rechts rutschen? Wenn ja, wozu? Lass es doch so, ist zudem auch übersichtlicher.
 
@angiii:
Gut, dass du nicht mit absoluten Werten arbeitest, das sollte man mit Java nur selten machen (es könnte sich z.B. die Schriftgröße oder das LookAndFeel ändern).

Zum ersten: reicht es nicht einfach, dass die JScrollPane nur Vertikal scrollen "darf"?

Zum zweiten: wie Akeshihiro sagt, so wie es jetzt ist, ist es übersichtlicher!
 
@genodeftest
Das Problem ist, dass auch wenn man die horizontale Scrollbar wegmacht, sich das Panel immer noch entsprechend der Komponenten in die Breite dehnt, also die Scrollbar einfach ausmachen is nich. Wie gesagt, mit einer empfohlenen Größe gehts einwandfrei. Das Lustige dabei ist jedoch, dass man diese nichtmals richtig einstellen muss. Die Größe scheint dabei vollkommen egal zu sein, sogar der leere Konstruktoraufruf (new Dimension()), welcher die Werte 0 und 0 hat, wird akzeptiert und das Panel bzw. das FlowLayout macht schon den gewünschten Job.

EDIT:
Hmm.. Ich seh grad, dass dabei auch die vertikale Scrollbar verschwindet und damit wäre auch niemandem geholfen. Ich schau mal weiter...

Also Dimension() (0,0) ist nur die halbe Lösung (wenn man das so sagen darf). Auf der x-Achse ist 0 richtig, aber jetzt is ja noch das Problem mit der y-Achse, da die vertikale Scrollbar ja schon zum Scrollen noch auftauchen soll. Da muss man dann halt einen entsprechenden Wert einsetzen. Das Problem ist jedoch, dass man diesen ausrechnen müsste, halt entsprechend der Komponentenhöhe und anzahl der Zeilen. Ist eher ne fummelige Sache, aber ein anderer Weg fällt mir gerade auch nicht ein, sorry.
 
Zuletzt bearbeitet:
Hallo,

danke schonmal für die vielen Antworten! Die Sache mit dem entfernen der horizontalen Scrollbar hatte ich schon getestet. Letztendlich will ich ja wirklich nur vertikal scrollen. Nutzte diesen Code

Code:
setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
Jedoch wurde dadurch wie hier schon erwähnt nur optisch die Scrollbar entfernt. Die Krokos wurden immer noch in den rechten Rand geschoben.

@ Akeshihiro: Werd heut mal deinen Tipp mit Dimension() (0,0) versuchen. Habe mir überlegt, dass ich mit einem ComponentListener bzw. componentResized die Größe meines Hauptpanels üerwache und dann den Inhalt dynamisch anpasse.

Stell mir aber gerade die Frage, ob es für solche Grafischen Sachen nicht irgendwelche netten Add-Ons gibt. Letztendlich muss meine Nutzerübersicht ja nicht so wie im Moment aussehen. Denke dabei an JGraph oder das Graphical Modeling Framework. Kenn beides aber nur vom Hörensagen. Wäre das eine Alternative?

Ansonsten teste ich mal das mit Dimension.
 
Die beiden erwähnten Frameworks könnten sicherlich genutzt werden (als Programmierer ist man ja kreativ ^^), aber ich habe mehr das Gefühl, dass die beiden Frameworks eher für visuelle Darstellungen gedacht sind als um damit zu "arbeiten", sprich eher sowas wie Klassendiagramme, PHP, Darstellung von Beziehungen und son Zeug.

Das mit dem Dimension hat ja (entgegen meiner anfänglichen Vermutung) nur zur Hälfte richtig funktioniert. Das Problem mit der horizontalen Scrollbar ist zwar behoben, dafür hat man dann aber das Problem mit der vertikalen Scrollbar, denn die is ja auch nich da, sollte dies aber sein, damit man durch die Krokos scrollen kann. Wie bereits gepostet, müsste man dann bei der preferedSize die y-Größe halt jedes mal entsprechend anpassen und um das zu können müsste man dann auch etwas rechnen, was ich aber nicht besonders schön finde.
 
Zuletzt bearbeitet:
Mensch du bist ja schneller im Testen als ich ;-). Wraplayout war die Lösung!
Danke für die Hilfe an alle!
 

Neue Beiträge

Zurück