# Zeilenumbruch nach n Zeichen in JTextArea



## Gast (5. Jan 2006)

Hallo,

Gibt es eine Möglichkeit bei einer JTextArea einen Zeilenumbruch nach einer bestimmten Zeichenanzahl, z.B. 100 Zeichen, zu erzwingen (ohne manuelll \n in den Text einzufügen)?

Habe schon an verschiedenen Stellen gesucht, aber nichts gefunden, ich hoffe hier kann mir jemand weiterhelfen.

Danke schlonmal im Voraus.


----------



## bummerland (5. Jan 2006)

nein so nicht, aber schau dir mal die beiden Methoden an:
setLineWrap(boolean wrap)
  Sets the line-wrapping policy of the text area.
setWrapStyleWord(boolean word)
  Sets the style of wrapping used if the text area is wrapping lines.


----------



## Gast (5. Jan 2006)

Die Funktionen nützen mir leider nichts.

setLineWrap(boolean wrap) (de)aktiviert nur das Wrapping und
setWrapStyleWord(boolean word) sorgt dafür, dass nicht mitten in Wörtern umgebrochen wird.

Dabei wird jedoch immer umgebrochen wenn das Ende der Textarea erreicht ist und nicht nach einer bestimmten Zeichenzahl.

Trotzdem Danke


----------



## Sky (5. Jan 2006)

Workaraound: Nimm eine Blockschriftart und definier die Breite deines TextArea auf "Buchstabenbreite * 100"


----------



## Gast (5. Jan 2006)

ich muss auf jeden Fall die Schriftart beibehalten.


----------



## Sky (5. Jan 2006)

Dann ist die Vorgabe m.E. nicht zu erfüllen.

- JTextArea muss verwendet werden
- Umbruch nach 100 Zeichen
- ohne manuelll \n einzufügen
- Schriftart beibehalten

Bei diesen Sachverhalt kann man m.E. höchstens 3 der 4 Anforderungen erfüllen (naja, mit entsprechendem Aufwand geht's vielleicht doch irgendwie...)


----------



## thE_29 (5. Jan 2006)

Das ist eh easy...

Einen Textlistener drauf, bzw irgendnen Listener...

Dann musst du den Inhalt mittels getText() holen!

Via String.split("\n") lässt du es dir mal auf Zeilen aufteilen..

Du nimmst immer das letzte Objekt und siehst nach ob die String.length() >100 Zeichen sind, falls ja wird ein \n eingefügt und via setText wieder draufgeklebt(manuell hin oder her.. irgendwer muss das mal einfügen.. außerdem ist manuell für mich wenn man selber enter drückt)

So würds ich machen!


----------



## Sky (5. Jan 2006)

Funktioniert aber so nur, wenn das Editieren in der Area nicht erlaubt ist... sonst können Zeilen dadurch zu kurz werden, dadurch dass jemand Zeichen "mitten im Text" löscht...


----------



## Gast (5. Jan 2006)

nee, das wird wohl nix...
Editieren ist erlaubt, es scheint also keine vernünftige Lösung zu geben. Mal schauen was ich da mache.

Thx to all


----------



## thE_29 (5. Jan 2006)

Wieso??

Das ist einfach rumrechnerei...


Du musst dir halt den ganzen Text tmp speichern und dann abgleichen wo ein Zeichen fehlt.. Somit weißt du wo du was ändern musst...


Es ist schwer und es gibt viele Bedingungen, nur machbar isses...


----------



## Sky (5. Jan 2006)

sehe ich auch so.

außerdem gibt es eine Lösung, die relativ einfach umzusetzen ist: 
gucken, wo geändert wurde
 -> am ende: the_29's erste Lösung
 -> mittendrin: alle \n entfernen und alle 100 Zeichen neue setzen

Guck Dir in dem Zusammenhang vielleicht mal die Klasse Document an.


----------



## Gast (5. Jan 2006)

> mittendrin: alle \n entfernen und alle 100 Zeichen neue setzen


Das kann ich auch nicht machen, schließlich kann auch der User Zeilen umbrechen, und die sollen schließlich erhalten bleiben.



> Das ist einfach rumrechnerei...


Ist schon klar, nur der damit verbundene Aufwand kommt für mich z.Z nicht in Frage. Ich hatte gehofft, dass es eine einfache Lösung gibt z.B. eine Methode wie lineWrappingAfter(int charsPerRow)

Aber mir fällt da gerade noch was anderes auf:



> - JTextArea muss verwendet werden
> - Umbruch nach 100 Zeichen
> - ohne manuelll \n einzufügen
> - Schriftart beibehalten



Wüsstest du denn eine Lösung ohne JTextArea aber mit den anderen Anforderungen? Es muss nämlich nicht zwingend diese Komponente sein.


----------



## thE_29 (5. Jan 2006)

Ggf, JtextPane anschaun!!


Wegen dem Zeilenumbruch (liest meine Beiträge überhaupt einer??)



Du merkst dir nach jedem gedrückten Zeichen den Text in einer tmp Variable!

Änderst du etwas MITTEN im Text, so vergleichst du es mit deinem alten (tmp) Text und findest dann den Unterschied somit raus...

Ergo, weißt du wo er was geändert hat und du kannst somit neu berechnen (für zB zeilenumbruch), etc.


----------



## Gast (6. Jan 2006)

Also gehen wir mal davon aus wir haben zwei Zeilen, eine mit 100 Zeichen und die zweite mit 50. Jetzt löscht der Nutzer in der ersten Zeile ein Zeichen. Dank der Zwischenspeicherung kann ich diese Änderung zwar erkennen, aber das Programm weiß jetzt nicht ob es den Umbruch jetzt eins nach rechts verschieben muss (so dass in der ersten Zeile weiterhin 100 stehen und in der zweiten 49) oder ob der Umbruch bleiben muss wo er ist (so dass in der ersten 99 stehen und in der zweiten 50), weil ihn der User selbst gesetzt hat.


----------



## Sky (6. Jan 2006)

Du musst einerseits genau das Speichern, was der User eingeben hat (inkl. alles CR/LF) und nach jeder Eingabe die Usereingabe prüfen usw. um den neuen String zu bekommen. (String#split(\n) und alle Zeilen > 100 Zeichen nochmal trennen)


----------



## Ey'n G (6. Jan 2006)

Das Problem ist doch, dass ich vom User gesetzte \n nicht von denen unterscheiden kann die das Programm setzt.


----------



## bummerland (6. Jan 2006)

mach doch ne textarea mit genau 100 columns :bae:


----------



## Ey'n G (6. Jan 2006)

meinst du das jetzt ernst?


----------



## bummerland (6. Jan 2006)

joa, wieso nicht?


----------



## Ey'n G (6. Jan 2006)

Das Attribut columns ist für die TextArea nur ein Anhaltspunkt wie breit sei sein sollte. Es wird dabei aus der Schriftart die optimale Breite ausgerechnet. Da meine Schrift aber unterschiedlich große Zeichen hat, kann es passieren (genauer: wird es passieren), dass in manchen Zeilen ein paar Zeichen mehr, in anderen weniger stehen.


----------



## bummerland (6. Jan 2006)

stimmt, hast recht.


----------



## Sky (9. Jan 2006)

Ey'n G hat gesagt.:
			
		

> Das Problem ist doch, dass ich vom User gesetzte \n nicht von denen unterscheiden kann die das Programm setzt.


Deshalb musst Du die User-Eingabe in einem String oder Stringbuffer speichern (inkl. "\n"). Dann kannst du per String#split("\n") ermitteln, wie der Text im Orignal aussehen würde.
Dann gehst Du das String[] welches split Dir liefert durch und guckst, welche Zeilen immer noch mehr als 100 Zeichen haben, diese bekommen entsprechende "\n"'s. Dabei wird der Original-Text (also was der Benutzer eingeben hat und was Du nochmal in einem String/Stringbuffer abgelegt hast) nicht geändert!


----------



## Ey'n G (9. Jan 2006)

Ich habe also das Textfeld, mit der korrekten Formatierung und einen Stringbuffer mit der orginal User-Eingabe.
Aber wo bekomme ich diese orginal User-Eingabe her. Vor der ersten Formatierung kann ich einfach den Inhalt des Textfeldes kopieren, aber danach nicht mehr, denn dann würden ja die \n des Programmes mitkopiert werden.


----------



## Sky (9. Jan 2006)

Kopier sie doch einfach nicht aus dem Textfeld, sondern häng' Dir einen KeyListener ran und fang die Events ab


----------



## Ey'n G (12. Jan 2006)

Dann bekomme ich mit welchen Key der User drückt, und wo (an welcher Position meines Vergleich-Strings) füge ich das Zeichen dann ein?


----------

