# Tipps zur automatischer Ausführung von Zeilenumbrüchen



## sewina (16. Nov 2007)

Undzwar geht es bei mir um ein Applet, welches 2 textares beinhalt undzwar ein Input und ein Output.
in dem input kann man beispielstweise irgendetwas eingeben, welcher im output gleichzeitig ausgegeben wird.
nun ist es so dass man zwar einstellen kann dass die ZeilenumbrÜche
automatisch gemacht werden, aber der eingegebene Text dabei nicht wirklich verändert
wird.Wenn man also den Text danach beispielsweise in einer Datei speichert, ist von den
automatisch "eingefügten“ Zeilenumbrüchen nichts mehr zu sehen.
nun möchte ich die Methode autowrap, die bei jeder Eingabe eines Zeichens im input aufgerufen wird, so verändern, dass der Text im output genauso aussieht wie oben. da ich aber noch nicht soviel erfahrung mit java habe, weiss ich noch nicht genau wie ich an an das problem rangehen soll. ich hab nur die schriftart so eingestellt dass die nichtpropotional ist, d.h. dass in jede Zeile genau gleich viele zeichen passen (30), so dass ich auch den fall mit leerzeichen leichter umgehen kann aber mir fehlt trotzdem noch die idee.
nun zu der Klasse:


```
import java.applet.Applet;                                          
import java.awt.event.TextListener;                                
import java.awt.event.TextEvent;
import java.lang.String;

public class RealWraps extends Applet                              
{                                                                     
        TextArea input, output;              
	String inputString, outputString;

        public void init() 
	{   
	    setFont(new Font("Times",Font.PLAIN, 24));
	    setSize(900, 650);
	    inputString = new String();
            input = new TextArea(null,10,30,TextArea.SCROLLBARS_NONE);
	    input.setFont(new Font("Courier",Font.BOLD, 24));                            
            input.addTextListener(new TextListener()
	    {        
        	public void textValueChanged(TextEvent e) 
		{ 
            	    autowrap();               
        	}                                             
            });
	    output = new TextArea(null,10,50,TextArea.SCROLLBARS_BOTH);
	    output.setFont(new Font("Courier",Font.BOLD, 24));                            
	    output.setEditable(false);
            
            add(input);
	    add(output);            
	} 
        
        public void autowrap() 
	{
	    outputString=input.getText();
	    output.replaceRange(outputString,0,output.getText().length());
        }                                                            
}
```

ich habe in der methode einfach mal  "outputString=input.getText();" zu stehen damit jetzt überhaupt etwas im output angezeigt bekomme.
ich hoffe ihr könnt mir weiter helfen.

danke


----------



## L-ectron-X (18. Nov 2007)

Ich glaube, hier gabs noch keine Antwort, weil keiner deinen Ausführungen folgen kann...


----------



## sewina (19. Nov 2007)

also wenn du den quellcode oben mal einfach als applet laufen lässt dann merks du ja, dass es jeweils ein textarea als input und ein weiterer als output im applet eingeblendet ist.
nun ist mein problem, dass bei jedem automatischen zeilenumbruch (am ende jeder zeile) im input keins im output gemacht wird, d.h. der im output eingeblendeter text ist dem des im input eingegebener text, von der struktur her, nicht identisch.
ich hoffe das war jetzt verständlicher formuliert  :?


----------



## L-ectron-X (19. Nov 2007)

Mir will da jetzt erstmal nur eine Lösung über FontMetrics einfallen...
Du ermittelst anhand der Zeichenbreite die Zeichen, die in eine Zeile der Eingabe passen und übertägst so die Zeichen in die Ausgabe.


----------



## sewina (19. Nov 2007)

nein ich glaub du hast was überflogen...
die schriftart (courier) ist so gewählt, dass nur 30 zeichen in einer Zeile des Eingabetextfeldes passen.


----------



## L-ectron-X (20. Nov 2007)

Hab mal verschiedenes probiert.
Schon die Vorstufe zum Umbruch ohne Worttrennung geht schon nicht:

```
public void autowrap()
   {
       outputString = input.getText();
       if(outputString.length() % 30 == 0) {
           outputString += System.getProperty("line.separator");
       }
       output.setText(outputString);
   }
```
 

```
public void autowrap()
   {
       output.setText(input.getText());
       if(output.getText().length() % 30 == 0) {
           output.append(System.getProperty("line.separator"));
       }
   }
```
Das liegt aber nicht am Code, sondern an der TextArea. Weil auf der Console funktionierts.


----------



## sewina (20. Nov 2007)

Meine Idee wäre eigentlich:

ich erstelle erstmal nur einen temp string der die eingegebenen Zeichen sozusagen einliest bis zum 31..
dann ab dem 31 soll in dem temp dann untersucht werden ob ein leerzeichen vorhaden ist. 

wenn ja: 

dann
soll die zeichenkette ab dem leerzeichen bis zum 31ten zeichen in die nächste outputzeile verschoben werden mit "\n".
der neue temp wird dann die zeichenkette zugeordnet, die nach unten verschoben wurde.
dann wird wie oben genannt der temp string zeichen für zeichen beim einlesen wieder bis zum 31ten gefüllt und die utnersuchen nach dem leerzeichen wird gestartet.

wenn aber kein leerzeichen stattfindet, dann soll der temp die gespeichertekette bis zum 30ten in der outputzeile ausgeben und dann ein weiteres "\n" plus dem 31 zeichen des temps hinzufügen.

da ich noch nicht viel erfahrung mit java habe, hab ichn wirrwar geschrieben, aber du kannst es dir mein code anschauen, der irgendwann beim ausführen in eine endlosschleife fällt  :bae: 

```
public void autowrap() {
		outputString ="";
		inputString = input.getText();
		int n = inputString.length();
		
		while (n>30){
			String temp= inputString.substring(0,31);
		if(30-temp.lastIndexOf(' ')<=30){ 
			outputString += inputString.substring(0,temp.lastIndexOf(' ')+1);
			inputString = "\n"+inputString.substring(temp.lastIndexOf(' '));
		}
		else {
			outputString += inputString.substring(0,temp.lastIndexOf(' ')+1) + "\n" + inputString.substring(n-1);
		}
		
			output.replaceRange(outputString, 0, output.getText().length());
		}

	}
```


----------

