LayoutManager Zeilenumbruch im Panel

Purgator

Aktives Mitglied
Aloha,
ich habe leider ein Problem wozu ich wieder theoretisch eine Lösung denke herstellen zu können... diese mir aber unnötig komplex erscheint.
Zum Problem:
Ich habe ein Panel in welchem ich Elemente derzeit im FlowLayout anordne (horizontales BoxLayout sollte auch gehen). Nun werden diesem Panel aber dynamisch zur Laufzeit neue Elemente (JLabels z.B.) hinzugefügt. Wenn das Panel nun "voll" ist würde ja standartmäßig einfach weiter hinten drangehongen und man würde erst sehen was da ist, wenn man das Panel vergrößert.
Alternativ könnte man natürlich Scrollbalken anbringen - beides ist aber bei mir nicht gewollt.
Ich würde wollen, dass es zu einem Zeilenumbruch kommt und die Elemente die nun dazu kommen in der nächsten Zeile angehongen werden.
Bsp (Punkte dienen nur zur Formatierung):
________
|.label....|
|_______|

und nun kommt noch eines hinzu -->

________
|.label.lab
|_______|
entstehen sollte aber

________
|.label....|
|.label....|
|_______|
Bisher habe ich beim rumspielen mit den Layouts dafür jedoch keine einfache Lösung gefunden, drum sehe ich momentan nur diese:
Immer wenn ein Element hinzugefügt wird, oder die Größe des Frames (und somit des Panels) geändert wird, wird eine Funktion aufgerufen.
Diese Funktion kennt alle Elemente die angezeigt werden sollen, und fügt so viele wie möglich in das Panel ein. Wenn "die Zeile" voll ist und noch Elemente übrig sind wird ein neues Panel und dem anderen erstellt und es wird wieder so vorgegangen.
Ein ähnliches vorgehen müsste man natürlich bei dem verkleinern der Panelfläche beachten.

Das ganze ist natürlich viel Rechnerei (Größe der Elemente wie JLabel und Panels vergleichen etc.) und es müssen laufend Elemente weggenommen und geadded werden, was bestimmt nicht für ein performantes Programm spricht (auch wenn das nicht das Problem sein sollte, wäre es doch unschön).

Gibt es da nicht eine Möglichkeit die bestehenden Layoutmanager zu nutzen, so das diese den "Zeilenumbruch" automatisch einfügen?
 

eRaaaa

Top Contributor
Soweit ich weiss macht das FlowLayout das auch so, das klappt aber auch nur, solange das Panel mit dem FlowLayout quasi alleine ist. Also darunter kein anderes Panel liegt.
Du könntest das WrapLayout nutzen
 

Purgator

Aktives Mitglied
Danke für die Antworten.
Auf den ersten Blick funktioniert es noch nicht ganz wie gewollt (bei beiden Layouts wird die Zeile nur so lang gemacht, wie das breiteste Element ist und danach immer umgebrochen - zumindest bei meinen Tests).
Ich denke aber, dass ich mit ein wenig Zeit und Arbeit das irgendwie anpassen kann - sei es in der LayoutManager-Klasse, oder im allgemeinen (sprich meinen) Code.
 

Purgator

Aktives Mitglied
Aloha,
Das Problem besteht leider immer noch und liegt daran, dass mein Panel selber auf einem anderen Panel (mit BoxLayout) liegt (wie eRaaaa wenn ich das richtig verstanden habe schon bemerkte).
Ich nehme an, dass es dadurch keine Größenbegrenzung gibt (die vom JFrame oder Vater-Panel wird anscheinend nicht weiter gegeben) und es kann über den Rand des JFrame hinaus was hinzugefügt werden --> es kommt zu keinem Zeilenumbruch.
Die beiden LayoutManager-Klassen haben wir wie gesagt in meinem konkreten Fall auch keine Hilfe gebracht, das ExtendedLayout dürfte sich nach der breitesten Komponente richten und danach den Zeilenumbruch ausrichten und das WrapLayout legt bei mir - ohne näher darauf einzugehen - ein ziemlich unkontrollierbares Verhalten an den Tag. Bei letzterem werde ich wohl noch Anpassungsversuche Vornehmen (weil ich den Code zugegebenermaßen beim kurzen ansehen noch nciht ganz verstanden habe), weiß jedoch nicht wie erfolgversprechend die sind (weil so wie ich das sehe kennt das WrapLayout ja nicht das Vaterpanel des Panels mit WrapLayout und somit nicht seine maximale Breite).

Jedenfalls bin ich auch noch auf diesen Beitrag gestoßen:
http://www.java-forum.org/codeschni...dsize-berechnen-gegebener-preferredwidth.html
Dort wird ein Vorgehen versucht, welches ich mir auch bereits überlegte. Ich bin in der Lage die maximale Breite du erkennen (Breite des Vaterpanels). Und wenn ich die prefferedSize vom eigentlichen Panel entsprechend setze kommen auch wieder die Zeilenumbrüche.
Problem ist, dass ich nur die Breite setzen will, weil sich mit evtl. entstehenden Zeilenumbrüchen die Höhe ja wieder ändert. Da mir jedoch keine Methode ausser setPreferredSize bekannt ist, welche die bevorzugte Breite setzt müsste ich zuerst die Höhe auf unendlich setzen (Integer.maxValue()) und danach anpassen.
Nun ist das Problem die Anpassung, woher ich wissen soll wie hoch das Panel wirklich sein soll. Aus der PreferredSize ist das nicht mehr ablesbar, da ich diesen Wert ja selber maximiert habe (wenn ich ihn nciht maximiere und gleich lasse, kenne ich die benötigte Größe ja auch nicht). Maximum/Minimum und derzeitige Größe helfen mir auch nicht weiter.
In den oben genannten Link wird ein View verwendet, mit welchen man
Java:
getPreferredSpan(View.Y_AXIS);
verwenden kann - also genau das was ich benötige.
Jedoch wüsste ich nicht wie ich entweder einen View auf ein JPanel anwenden kann - oder eine PreferredSpan Methode ohne View benutzen könnte.
Gibt es da eine Möglichkeit das mit einem JPanel zu nutzen?
 

Purgator

Aktives Mitglied
Mittlerweile ist das Problem (zumindest wie es aussieht) nurnoch von akademischer Natur (also ich brauche nicht mehr die Lösung unbedingt, da es umgangen wird).
Aber versuchen zu erklären was ich meinte tue ich trotzdem nochmal... ich weiß leider dass ich mich nicht immer ganz verständlich ausdrücken kann.
Vom Grundaufbau habe ich ein großes Panel in der contentPane von meinem JFrame (eigentlich sind noch ein paarPanels dazwischen um eine Art menu hinzuzufügen, aber die dürften keine Rolle spielen).
Dieses Panel hat ein vertikales BoxLayout (BoxLayout.Y_AXIS).
Zu diesem Panel (ich nenne es mal zwecks Eindeutigkeit "zeilenPanel") werden nun zur Laufzeit immer mal wieder Panels ("problemPanel" - denn in diesem liegt mein Problem ;) ) hinzugefügt.
Zu diesem problemPanel werden nun auch zur Laufzeit immer wieder Komponenten hinzugefügt - z.B. etliche Labels (welche nebenbei nur immer ein Wort enthalten, was aber nicht weiter von Bedeutung ist).
Nutze ich nun im problemPanel das FlowLayout, und die Komponenten passen nicht mehr in eine Zeile des problemPanels, so wird einfach ins "unsichtbare" über das Frame hinaus geschrieben - gleiches gilt für das horizontale BoxLayout.
Nutze ich das ExtendedFlowLayout, so kommen Zeilenumbrüche. Diese werden aber nur mit sehr großem Zufall am Ende des Frames gemacht, denn nach meinen Tests und Quellcodeverständnis geht dieses im groben Layout so vor:
- schaue welche Komponente auf dem Panel die größte Breite hat
- füge nun die Elemente dem Panel hinzu und beginne immer eine neue Zeile wenn diese Breite erreicht wurde
(Wenn ich mich recht erinnere wird da noch die sichtbarkeit geprüft, wenn ich diese Prüfung anpassen würde könnte ich evtl. ein unsichtbares Element mit der entsprechenden Breite einfügen fällt mir gerade ein. Wenn ich heute abend dazu Zeit habe teste ich das vllt. mal, aber weiß auch gerade nicht ob ich den Quellcode dahingehend richtig im Kopf habe)
Da der Zeilenumbruch nun also nicht nach dem zeilenPanel oder Frame ausgerichtet wird, hat mir dieses Layout nicht geholfen.
Das WrapLayout wie gesagt ist mir ein Rätsel. Hatte ich 2 zeilenPanel's bereits eingefügt (und das erste blieb leer) und es wurden zum zweiten etliche Labels hinzugefügt, so funktionierte es wie gewollt (nachdem man die Größe des Frames einmal änderte).
Sobald man jedoch zuerst in das erste problemPanel Labels hinzufügte kamen keine Zeilenumbrüche, sondern es wurde wieder ins unsichtbare geschrieben. Erst wenn man die Breite des Frames um etliches verkleinerte kamen wieder die richtigen Zeilenumbrüche.
Ich möchte nicht ausschließen, dass da auch irgendwas an meinen Code die Ursache ist - erklären kann ich mir das Verhalten des WrapLayouts dennoch nicht.
Deswegen bin ich mittlerweile auch froh dass dieser Aufbau verworfen wurde, denn im Moment fiel mir nichts mehr ein, als ähnlich wie im ersten Beitrag von mir vorzugehen (um genau die Anforderungen zu erfüllen).
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Swing Cell Renderer für Zeilenumbruch in JTable AWT, Swing, JavaFX & SWT 0
M Dynamische Zellengröße und Zeilenumbruch AWT, Swing, JavaFX & SWT 7
D Zeilenumbruch in einer JTable AWT, Swing, JavaFX & SWT 9
W Swing JTable Zeilenumbruch innerhalb einer Zelle AWT, Swing, JavaFX & SWT 3
T JTextPane ignoriert HTML Zeilenumbruch <br> tag wegen eigenem HTMLEditorKit AWT, Swing, JavaFX & SWT 5
E JavaFX TableView mit Zeilenumbruch in Zellen AWT, Swing, JavaFX & SWT 5
X JTextPane automatischer Zeilenumbruch IM Wort AWT, Swing, JavaFX & SWT 2
S Swing Warum funktioniert der automatische Zeilenumbruch mit arabischen Zeichen beim JTextPane nicht AWT, Swing, JavaFX & SWT 3
S Swing Automatischer Zeilenumbruch bei JTextPanes AWT, Swing, JavaFX & SWT 2
A Zeilenumbruch per button AWT, Swing, JavaFX & SWT 5
S Zeilenumbruch jTextArea mit toString AWT, Swing, JavaFX & SWT 2
S Swing Zeilenumbruch in JTable Zellen AWT, Swing, JavaFX & SWT 3
R JavaFX Automatischer Zeilenumbruch in Text AWT, Swing, JavaFX & SWT 13
B SWT Text - zeilenumbruch AWT, Swing, JavaFX & SWT 2
N Swing JTree TreeCellRenderer mit html und automatischen Zeilenumbruch AWT, Swing, JavaFX & SWT 8
T Nimbus JButton: Zeilenumbruch korrigieren? AWT, Swing, JavaFX & SWT 9
B Swing JEditorPane ohne Zeilenumbruch nach InputStream AWT, Swing, JavaFX & SWT 2
B Swing Zeilenumbruch in Graphics AWT, Swing, JavaFX & SWT 20
O JOptionPane.showMessageDialog mit automatischem Zeilenumbruch AWT, Swing, JavaFX & SWT 9
F Jgrid Zeilenumbruch AWT, Swing, JavaFX & SWT 10
GianaSisters Swing JTable Zellen intelligenter Zeilenumbruch AWT, Swing, JavaFX & SWT 4
C Zeilenumbruch von JTextPane wird nicht erkannt AWT, Swing, JavaFX & SWT 2
Zettelkasten drawString() Zeilenumbruch AWT, Swing, JavaFX & SWT 2
N Swing JTable - Problem mit Zeilenumbruch AWT, Swing, JavaFX & SWT 6
Spot84 swt label zeilenumbruch will nicht funktionieren AWT, Swing, JavaFX & SWT 1
H SWT Zeilenumbruch in List AWT, Swing, JavaFX & SWT 9
K Swing jTextPane zeilenumbruch AWT, Swing, JavaFX & SWT 2
S Swing jTextPaine kein Zeilenumbruch nach setText() AWT, Swing, JavaFX & SWT 9
S Zeilenumbruch in MsgBox AWT, Swing, JavaFX & SWT 13
eskimo328 JTable Zeilenumbruch im Header AWT, Swing, JavaFX & SWT 2
A JLabel und Zeilenumbruch - Nicht das Übliche AWT, Swing, JavaFX & SWT 4
G Buttonbeschreibung mit Zeilenumbruch AWT, Swing, JavaFX & SWT 3
D Toolbars und Zeilenumbruch (benutze FlowLayout) AWT, Swing, JavaFX & SWT 2
M Zeilenumbruch bei MessageFormat gesucht AWT, Swing, JavaFX & SWT 10
G Tooltip Zeilenumbruch AWT, Swing, JavaFX & SWT 13
7 Zeilenumbruch in Textfeld AWT, Swing, JavaFX & SWT 3
M JLabel Zeilenumbruch AWT, Swing, JavaFX & SWT 10
M setLineWrap() + echten Zeilenumbruch AWT, Swing, JavaFX & SWT 4
I Automatischer Zeilenumbruch in JTextArea? AWT, Swing, JavaFX & SWT 5
D Zeilenumbruch in einer JTable AWT, Swing, JavaFX & SWT 3
G JEditorPane Zeilenumbruch verhindern AWT, Swing, JavaFX & SWT 2
G JLabel mit Zeilenumbruch AWT, Swing, JavaFX & SWT 6
G Fehleranzeige im Textfeld bei Zeilenumbruch AWT, Swing, JavaFX & SWT 4
S JLabel zeilenumbruch ? geht das in JDialog? AWT, Swing, JavaFX & SWT 2
O Zeilenumbruch erzwingen (FlowLayout? AWT, Swing, JavaFX & SWT 1
A Automatischen Zeilenumbruch AWT, Swing, JavaFX & SWT 5
R JTree: Zeilenumbruch in Node AWT, Swing, JavaFX & SWT 6
G Zeilenumbruch nach n Zeichen in JTextArea AWT, Swing, JavaFX & SWT 24
P TextArea zeilenumbruch AWT, Swing, JavaFX & SWT 7
T Zeilenumbruch auf JButton AWT, Swing, JavaFX & SWT 6
M JTextPane - Zeilenumbruch verhindern stoppen deaktivieren :) AWT, Swing, JavaFX & SWT 5
T JTable, Zeilenumbruch in Zellen AWT, Swing, JavaFX & SWT 23
C Zeilenumbruch in einem JTextPane nach einem vorgegebenen cm AWT, Swing, JavaFX & SWT 2
M Jeditorpane + zeilenumbruch AWT, Swing, JavaFX & SWT 2
M Zeilenumbruch beim JLabel AWT, Swing, JavaFX & SWT 3
N JTextArea Zeilenumbruch erzwingen AWT, Swing, JavaFX & SWT 2
D [SWT] Zeilenumbruch für Tabelle AWT, Swing, JavaFX & SWT 4
R Zeilenumbruch in JTable AWT, Swing, JavaFX & SWT 2
bernd Zeilenumbruch in JEditorPane AWT, Swing, JavaFX & SWT 10
E Zeilenumbruch in einem AWT TextField AWT, Swing, JavaFX & SWT 2
R JTextPane: Zeilenumbruch AWT, Swing, JavaFX & SWT 3
G JTable Zeilenumbruch innerhalb einer Zelle bzw. columnHeader AWT, Swing, JavaFX & SWT 1
G Zeilenumbruch in einer SWT TableItem AWT, Swing, JavaFX & SWT 1
bummerland ein zeichen nach einem zeilenumbruch einfügen AWT, Swing, JavaFX & SWT 4
L paintComponent in Panel eines Borderlayouts hinzufügen AWT, Swing, JavaFX & SWT 3
A Problem Spiel auf Panel der GUI zu bringen AWT, Swing, JavaFX & SWT 1
CptK Ordentlicher Code & Panel ab bestimmter Komponentenzahl scrollbar machen AWT, Swing, JavaFX & SWT 12
B JTextField in Panel positionieren AWT, Swing, JavaFX & SWT 1
R Swing Panel nur bei Maus sichtbar AWT, Swing, JavaFX & SWT 2
B mit Maus verschiebbares Panel AWT, Swing, JavaFX & SWT 2
S Labels in Panel erstellen AWT, Swing, JavaFX & SWT 1
H Aus Array Container Panel an Tabbedpane zuweisen AWT, Swing, JavaFX & SWT 29
S Swing Panel wird nicht neu gezeichnet AWT, Swing, JavaFX & SWT 3
O Kann kei neues Panel zum zeichnen aufrufen... AWT, Swing, JavaFX & SWT 4
J Overlay Panel statt neues Fenster AWT, Swing, JavaFX & SWT 6
CptK Swing DropdownMenu über Panel-Grenzen hinaus anzeigen AWT, Swing, JavaFX & SWT 1
J Aufklappbares Panel in Toolbar AWT, Swing, JavaFX & SWT 6
L ActionListener zu Button in Panel hinzufügen AWT, Swing, JavaFX & SWT 10
S Swing Panel übernimmt komponenten von anderem AWT, Swing, JavaFX & SWT 7
J Panel auf Frame positionieren AWT, Swing, JavaFX & SWT 9
J JFrame Panel hinzufügen AWT, Swing, JavaFX & SWT 10
B AWT Panel größe im BorderLayout einstellen AWT, Swing, JavaFX & SWT 1
K Swing Entfernen von Panel funktioniert nicht AWT, Swing, JavaFX & SWT 5
L JavaFX Animation für Panel wechsel AWT, Swing, JavaFX & SWT 3
L Swing JTable im Panel darstellen AWT, Swing, JavaFX & SWT 8
L JavaFX Klickverhalten bei einem Panel AWT, Swing, JavaFX & SWT 1
A Swing Panel mit ScrollBar AWT, Swing, JavaFX & SWT 7
K Panel verdeckt MenuItem AWT, Swing, JavaFX & SWT 5
H zwei gleich große Panels getrennt durch ein weiteres Panel AWT, Swing, JavaFX & SWT 10
N Swing Label auf Panel legen.. AWT, Swing, JavaFX & SWT 2
J Panel auf Frame löschen und neues Panel Hinzufügen AWT, Swing, JavaFX & SWT 4
T Swing Graphics auf Panel AWT, Swing, JavaFX & SWT 2
B Swing WindowBuilde: Menu -> anderes Panel wechseln AWT, Swing, JavaFX & SWT 1
U Java FX Zusätzliches Label per Knopfdruck während der Laufzeit auf Panel einfügen. AWT, Swing, JavaFX & SWT 2
P AWT Panel überschreibt vorheriges... AWT, Swing, JavaFX & SWT 2
Thallius Swing Warum kann man Texte im Panel nicht markieren? AWT, Swing, JavaFX & SWT 1
S NetBeans, Panel in Frame einfügen AWT, Swing, JavaFX & SWT 3
M AWT Panel wird nicht angezeigt AWT, Swing, JavaFX & SWT 7
P Fenstergröße ändern, Panel soll gleich bleiben AWT, Swing, JavaFX & SWT 2
M JavaFX Slide Panel AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben