# TextArea über mehrere Zeilen - wie Zeileanzahl abfragen?



## MadBlue (1. Mrz 2012)

Hallo zusammen,

ich habe ein Problem dem ich nicht ganz Herr werde... folgendes ist das Kernproblem:
ich habe eine JTextArea mit einer begrenzten länge. Wenn die Länge erreicht wird wird automatisch in der nächsten Zeile weiter geschrieben. Das erreiche ich mit:
 this.setWrapStyleWord(true);
 this.setLineWrap(true);

Bei der Textausgabe (getText) ist das dann allerdings doch wieder nur eine Line...
ich möchte aber herausfinden wieviele Zeilen das Teil erreicht.

(Hintergrund: die Textarea steckt in einer Tabelle, ich möchte die Zeilenhöhe natürlich erhöhen wenn ich mehrere Zeilen brauche in der TextArea...)

mit getLineCount etc. komm ich leider nicht ans Ziel, auch mit dem line.sperator hab ich keine Ergebnisse erreicht...

Hat hier wer eine kluge Idee für mich?

Sören


----------



## KrokoDiehl (1. Mrz 2012)

Verstehe ich Recht dass es hier um die Darstellung einer JTextArea in einer Tabelle (als Renderer/Editor) geht und du die Zeilenhöhe anpassen möchtest?

In dem Fall hast du mehrere Möglichkeiten. In deiner Tabelle kannst du die 
	
	
	
	





```
editingStopped()
```
-Methode überschreiben und dort reagieren, wenn sich der Inhalt einer JTextArea geändert hat. Mit 
	
	
	
	





```
JTable.setRowHeight()
```
 kannst du dann die Zeilenhöhe anpassen.
Du könntest auch an deinen TextArea-TableCellEditor einen Listener hängen (_CellEditorListener_ oder so) und dort das eben beschriebene Prozedere ausführen.


----------



## MadBlue (1. Mrz 2012)

Huhu,

ja fast, ich brauch das nur im Renderer, im Editor ist das egal, die eingaben sind nur Floats und die sind nicht so arg lang.

Das Problem ist halt, das die Tabelle dynamisch gefüllt wird (aus einem externen Datenbestand) und ich vorher nicht weiß wie groß die Spalte sein muss... daher hab ich mir für den Renderer etwas in der Art ausgedacht:

JTable.setRowHight(Anzahl-Zeilenumbrüche * 20px);

Dazu müsste ich aber die automatisch umgebrochenen Zeilen irgendwie raus lesen... und genau das funktioniert nicht...

Sören


----------



## KrokoDiehl (1. Mrz 2012)

Ich würde die Daten zuerst einmal in die Tabelle laden. Immerhin ist die Darstellung mit Zeilenumbruch auch nur eine reine Darstellung. Wie du ja erwähnt hast, hat der Text gar keine echten Zeilenumbrüche.
Wenn alles in der Tabelle ist, kannst du die Zeilenhöhen anpassen lassen. Schau dir mal den TableColumnAdjuster an. Hier geht es zwar um die Spaltenbreite, aber das Prinzip lässt sich auch auf die Zeile anwenden:
Du gehst über alle Zeilen und holst die dir gewünschte Höhe (preferredSize.height) der Renderer. Aus dem jeweiligen Maximum der Zeile kannst du die Gesamthöhe setzen.

Hier der Codeauschnitt für Spalten:

```
/*
	 *  Calculate the width based on the widest cell renderer for the
	 *  given column.
	 */
	private int getColumnDataWidth(int column)
	{
		if (! isColumnDataIncluded) return 0;

		int preferredWidth = 0;
		int maxWidth = table.getColumnModel().getColumn(column).getMaxWidth();

		for (int row = 0; row < table.getRowCount(); row++)
		{
    		preferredWidth = Math.max(preferredWidth, getCellDataWidth(row, column));

			//  We've exceeded the maximum width, no need to check other rows

			if (preferredWidth >= maxWidth)
			    break;
		}

		return preferredWidth;
	}
```


----------



## MadBlue (1. Mrz 2012)

hmmmm... ich werd gleich mal versuchen das so rein zu nehmen, aber es würde mich wundern wenn das so funktioniert, die preferedHight von der JTextArea bleibt ja dummerweise ebenfalls auf 16 wenn der Platz nicht da ist...

Sören


----------



## MadBlue (1. Mrz 2012)

Ich nochmal,

mit der breite hast du mich auf eine andere, gute Idee gebracht!

die preferedHight war ja leider immer 16, die preferedWidth hingegen nicht!

Nu geh ich her und sage halt: Wenn preferedWidth > maximale Spaltenbreite dann doppelte Höhe pro Zeile... wunderbar...
nu muss ich nur noch den Workaround um die Dauerschleife integrieren...

Auf jedenfall besten Dank mal wieder!

Sören


----------

