Swing ListCellRenderer + JTextArea + LineWrap

hdi

Top Contributor
Hallo,

Ich habe ein Problem mit der Darstellung einer JTextArea innerhalb einer JList. Der Renderer:

Java:
public class MyListRenderer implements ListCellRenderer{
	
	private JTextArea txt;

	public MyListRenderer () {
		txt = new JTextArea();
		txt.setLineWrap(true);
		txt.setWrapStyleWord(true);
	}

	@Override
	public Component getListCellRendererComponent(JList list,
			Object value, int index, boolean isSelected, boolean cellHasFocus) {
		txt.setText(value.toString());
		System.out.println(txt.getPreferredSize());
		return txt;
	}
}

Das Problem liegt nun im LineWrap: Dieses funktioniert zwar, allerdings passt sich die TextArea in ihrer Größe nicht an. Heißt: Wenn der Text umgebrochen wird auf 2 Zeilen, ist die TextArea trotzdem nur so hoch dass sie nur eine Zeile anzeigt. Wenn der Text Zeilenumbrüche (\n) enthält, passt sich die TextArea dahingegen an und wird höher.

Um herauszufinden was da los ist hab ich das obige sysout eingebaut. Und da kommen dann ganz seltsame Werte heruas, genauer ist der Wert für die Höhe irrsinnig hoch. Bei Text, der in eine Zeile passen würde liefert das schon 188 Pixel, bei Text der mittels Line-Wrap auf 4 Zeilen umgebrochen wird sind es fast 3000. Ja 3000, nicht 300.

Es stellen sich mir nun folgende Fragen: Wie errechnet sich denn bitte diese Höhe für die preferredSize? Und: Wie kommt's, dass der Renderer diese Größe gar nicht annimmt? Komisch finde ich halt vor allem dass es grundsätzlich bei mehreren Zeilen (per Zeilenumbruch) schon klappt , aber bei mehreren Zeilen die durch LineWrap verursacht sind kriegt er nix mit.. Wobei das ja anscheinend in die prefferedSize einfließt, die aber ignoriert wird.

Ideas?
 
Zuletzt bearbeitet:
Ach du meine Güte... sieht ja schlimm aus 😀 Gut ich werd sehen ob ich's auf die List adaptieren kann. Danke!
 
Hm das Beispiel tweakt zu krass an der Table rum. Viele entsprechende Einstellungsmöglichkeiten hab ich in der JList gar nicht. Ich hab jetzt noch etwas weiter recherchiert und mehr oder weniger ist die Antwort "Nicht möglich". Ich weiß ich könnte mir meine ganz eigene ScrollList programmieren, aber ich will noch nicht aufgeben.

Eine Idee für ein Workaround hätte ich: Ich kann mir die Anzeige-Größe der Liste (die ich ja mitbekomm in der Methode) abfragen, sowie den anzuzeigenden Text. Berücksichtigt man dann noch die FontMetrics kann man sich selbst ausrechnen wo er wrappt und die Größe manuell setzen. Und genau da scheiter ich jetzt wieder.

Ein
Code:
txt.setPreferredSize()
funktioniert zwar, d.h. damit kann ich pixelgenau die Höhe festlegen - lustigerweise aber nur beim ersten Call der Methode. Ich kann also die TextArea-Höhe einmalig festlegen und dann nicht mehr verändern. Was ja blöd ist, weil ich das ja zur Laufzeit abhängig von der Anzeigebreite der JList anpassen muss. Aber der Hammer kommt jetzt: Selbst wenn ich jedes mal eine neue Instanz der TextArea erzeuge, und der eine bestimmte Größe verpasse, bleibt es bei der alten Größe. Aber die kann man beim ersten Call beeinflussen. Wie auch immer die JList auf die Anzeige-Größe kommt, das muss ein riesen Chaos sein und ist für mich null nachvollziehbar.

Wer kriegt es hin, die Größe einer JTextArea in einer JList zur Laufzeit zu ändern?
 
Nur so eine Idee, schon mal versucht, ein JPanel als Container für die TextArea zu nutzen und das dann an die Liste zu geben?
Vielleicht kann der LayoutManager des Panels dein Problem beheben.

Zugegeben, ist nicht die feine englische aber könnte ja eine Möglichkeit sein.

Gruß Vanny
 
Leider auch keine Chance :noe: Ich glaub das wird nix. Ich hab zwischenzeitlich noch etwas bei Google gefunden, das einleuchtet:

The paradox is that the JList expects the rendering components to report their size in order to determine the desired size of the JList, while the JTextArea requires sizing information in order to word-wrap.

Ich find's nur doof dass man die Größe nicht mal per Hand setzen kann..
 

Neue Themen


Zurück
Oben