# Textbreite von Font inklusive Tabs ermitteln



## igelwald (30. Sep 2011)

Hallo,

ich habe eine JTextArea implementiert und deren paint Methode erweitert, so dass ich ein Image für den Zeilenumbruch am Ende der Zeile zeichne. Das soll so ein Zeilenumbruchanzeige werden, wie es Word ja auch hat.

Das klappt auch ganz gut, nur klappt's nicht, wenn im Text ein Tabulator steht, weil die Methode 
	
	
	
	





```
getFontMetrics(getFont()).stringWidth(text)
```
 , die ich verwende mit nicht die Tabulatorbreite mitberechnet.

Daraufhin habe ich versucht mit die selbst zu berechnen mit 

```
tabWidth = getFontMetrics(getFont()).charWidth('w') * getTabSize();
```

und das mit der Anzahl Tabs multipliziert.
Das sieht aber auch manchmal ziemlich schrecklich aus, besonders bei Texten mit schmalen Buchstaben und klappt auch nicht immer.


Hat jemand einen Tipp, wie man das hinbekommt?


Danke und Gruß,
igelwald


----------



## André Uhres (30. Sep 2011)

Hallo Igelwald,

herzlich willkommen bei java-forum.org!

JTextArea verfügt über spezielle getLine...() Methoden, mit denen du dein Problem sicher lösen kannst:

getLineCount() Determines the number of lines contained in the area.
getLineEndOffset(int line) Determines the offset of the end of the given line.
...

Gruß,
André


----------



## igelwald (30. Sep 2011)

Hallo Andre,

danke für die Antwort.

Aber ich verstehe jetzt nicht, was ich mit diesen Methoden machen soll?

Meine Implementierung  meiner abgeleiteten TextArea sieht bis jetzt vor das super.paint() der JTextArea zu verwenden und in meinem Code am Ende jeder Zeile ein Zeichen für Zeilenumbruch zu malen. 
Mein Problem ist, dass ich nicht die exakten Koordinaten des jeweiligen Zeilenendes ermitteln kann, sobald ein Tabulator im Text vorkommt.
getLineEndOffset gibt mir ja nur, an welcher Stelle die Zeile umgebrochen wird, aber nicht die Koordinaten oder Zeilenbreite, damit ich zeichnen kann.

Vllt. ist meine Heransgehensweise mit der eigenen paint() Methode ja auch nicht optimal?


Gruss,
igelwald


----------



## André Uhres (1. Okt 2011)

igelwald hat gesagt.:


> getLineEndOffset gibt mir ja nur, an welcher Stelle die Zeile umgebrochen wird, aber nicht die Koordinaten oder Zeilenbreite, damit ich zeichnen kann.


Du hast natürlich recht, ich glaube ich werde langsam alt .


igelwald hat gesagt.:


> Vllt. ist meine Herangehensweise mit der eigenen paint() Methode ja auch nicht optimal?


Ja, da hast Du wohl auch recht. Anstatt eine JTextArea, nimm doch lieber mal eine JTextPane (sie unterstützt eingebettete Komponenten).

Gruß,
André


----------



## igelwald (5. Okt 2011)

Hallo Andres,

in der Zwischenzeit habe ich auch eine Lösung für normale JTextAreas gefunden.

Dafür gibt's die Utilities aus java.lang.txt.Utilities.

   int sWidth = Utilities.getTabbedTextWidth(new Segment(theText.toCharArray(), 0, theText.length()), 
                                    getFontMetrics(getFont()), 0, 
                                    (PlainView) getUI().getRootView(this).getView(0), 0);      


Danke für die Hilfe.

Gruß,
igelwald


----------

