Hi folks,
ich arbeite gerade an meinem ersten Java-GUI und habe ein relativ komplexes Problem, zu dem ich keine Lösung finde:
Ich habe in meinem JFrame eine JSplitPane (mit VERTICAL_SPLIT). Oben habe ich eine JScrollPane "upperContainer" drin. Das grundsätzliche Problem ist nun, dass ich darin nur einen vertikalen Scrollbalken haben will und den Inhalt, wenn er in der Horizontalen zu lang wird, umbrechen will.
Das sieht im Moment so aus: Ich habe ein JPanel "metadata" im upperContainer, das allen weiteren Inhalt enthalten soll. (Um genau zu sein, ist das eine eigene Klasse, die vom JPanel erbt.) Dieses metadata soll nun eigentlich immer genauso breit sein wie der upperContainer.
Das Problem ist nun, dass ich darin ein weiteres JPanel "tpPanel" habe, das einige Eingabeelemente enthält. Dieses tpPanel benutzt das FlowLayout, um die Elemente nebeneinander darzustellen und ggf. umzubrechen bei Platzmangel.
Da das metadata-JPanel nun in einer JScrollPane ist, kümmert es sich natürlich von selbst nicht darum, seine Width der der JScrollPane anzupassen. Das muss ich also selbst tun. Dazu verwende ich einen ComponentListener auf JFrame-Ebene, der dieses tut:
Wenn ich nur die MaximumSize von metadata ändere, wird dieses nie kleiner als das tpPanel, also muss ich dessen MaximumSize zuerst setzen. Wie man sieht, versuche ich schon verzweifelt, die MaximumSize mit repaint anzuwenden, was aber einfach nicht tut.
Der Witz ist jetzt: Ändere ich nun die Position der JSplitPane, dann wird metadata mit tpPanel genau so dargestellt, wie ich es haben will (also die Elemente im tpPanel werden dann an der richtigen Stelle umgebrochen). Die Änderungen, die ich eigentlich im ComponentListener mache, werden quasi erst dann umgesetzt.
Deshalb nun meine Frage: Wie kann ich die Änderung der MaximumSize sofort anwenden? repaint funktioniert erwiesenermaßen nicht.
Oder Alternativfrage: Hat jemand vielleicht eine bessere Lösung, die das tut, was ich will?
Danke im Voraus für Antworten.
ich arbeite gerade an meinem ersten Java-GUI und habe ein relativ komplexes Problem, zu dem ich keine Lösung finde:
Ich habe in meinem JFrame eine JSplitPane (mit VERTICAL_SPLIT). Oben habe ich eine JScrollPane "upperContainer" drin. Das grundsätzliche Problem ist nun, dass ich darin nur einen vertikalen Scrollbalken haben will und den Inhalt, wenn er in der Horizontalen zu lang wird, umbrechen will.
Das sieht im Moment so aus: Ich habe ein JPanel "metadata" im upperContainer, das allen weiteren Inhalt enthalten soll. (Um genau zu sein, ist das eine eigene Klasse, die vom JPanel erbt.) Dieses metadata soll nun eigentlich immer genauso breit sein wie der upperContainer.
Das Problem ist nun, dass ich darin ein weiteres JPanel "tpPanel" habe, das einige Eingabeelemente enthält. Dieses tpPanel benutzt das FlowLayout, um die Elemente nebeneinander darzustellen und ggf. umzubrechen bei Platzmangel.
Da das metadata-JPanel nun in einer JScrollPane ist, kümmert es sich natürlich von selbst nicht darum, seine Width der der JScrollPane anzupassen. Das muss ich also selbst tun. Dazu verwende ich einen ComponentListener auf JFrame-Ebene, der dieses tut:
Code:
public void componentResized(ComponentEvent e) {
metadata.tpPanel.setMaximumSize(new Dimension(upperContainer.getWidth(), 200));
metadata.tpPanel.repaint();
metadata.setMaximumSize(new Dimension(upperContainer.getWidth(), 600));
metadata.repaint();
}
Der Witz ist jetzt: Ändere ich nun die Position der JSplitPane, dann wird metadata mit tpPanel genau so dargestellt, wie ich es haben will (also die Elemente im tpPanel werden dann an der richtigen Stelle umgebrochen). Die Änderungen, die ich eigentlich im ComponentListener mache, werden quasi erst dann umgesetzt.
Deshalb nun meine Frage: Wie kann ich die Änderung der MaximumSize sofort anwenden? repaint funktioniert erwiesenermaßen nicht.
Oder Alternativfrage: Hat jemand vielleicht eine bessere Lösung, die das tut, was ich will?
Danke im Voraus für Antworten.