# Zeilenumbruch awt.textarea



## Skull (27. Mrz 2009)

Hallo,
ich würde gerne für jeden Eintrag eine neue Zeile verwenden, habe bisher 
ta.setText(ta.getText() + "\n" + newresult);
probiert.... dadurch wird die Zeile leider nicht gewechselt.

Jemand eine Idee?


----------



## Ebenius (27. Mrz 2009)

Dann machst Du was anderes falsch. Hier geht's schließlich auch: [Highlight=Java]final TextArea textArea = new TextArea(5, 40);
for (int i = 0; i < 100; i++) {
  final String s = textArea.getText();
  textArea.setText(s.length() == 0 ? ((i + 1) + ". Zeile") : (s
        + "\n"
        + (i + 1) + ". Zeile"));
}

final Frame f = new Frame("AWT Text Area");
f.add(textArea);
f.pack();
f.setLocationRelativeTo(null);

f.addWindowListener(new WindowAdapter() {

  @Override
  public void windowClosing(WindowEvent e) {
    System.exit(0);
  }
});

f.setVisible(true);[/Highlight]
Ebenius


----------



## max40 (27. Mrz 2009)

Also bei mir funktioniert das ohne Probleme!
Hast du Code dazu?


----------



## Ebenius (27. Mrz 2009)

Ich war schneller, ätsch.


----------



## Skull (27. Mrz 2009)

Bei mir entsteht das hier:

ergebnis1[]ergebnis2

Das "[]" ist ein Viereck (kann ich hier im Forum nicht darstellen), dass er wohl für das \n einfügt. Den Code den ich verwende habe ich oben gepostet.


----------



## Skull (27. Mrz 2009)

if(ta.getText().length() == 0)
		{

		ta.setText(result);
		}else{
			ta.setText(ta.getText() + "\n" + result);
		}

Wenn ich das durchführe, dann macht er bis Ergebnis 2 alles richtig und dann wieder den alten Fehler: Ausgabe ist:

Ergebnis1
Ergebnis2[]Ergebnis3[]Ergebnis[]4


Irgendwie liest er das wohl anders aus....


----------



## Ebenius (27. Mrz 2009)

... und "result" ist was?

Ebenius


----------



## Skull (27. Mrz 2009)

result ist ein einfacher String


----------



## Ebenius (27. Mrz 2009)

Sicher, dass "ta" eine TextArea ist und kein TextField oder sowas?


----------



## Skull (27. Mrz 2009)

Yep .


----------



## Ebenius (27. Mrz 2009)

Dann mach doch mal so ein hübsches Beispiel wie ich oben, welches man einfach nur noch in eine main(...)-Methode einfügen muss.

Ebenius


----------



## Skull (27. Mrz 2009)

[HIGHLIGHT="Java"]	/**
	 * @param args
	 */
	public static void main(String[] args) {
		final TextArea textArea = new TextArea();
		final TextField tf = new TextField();

		final Frame f = new Frame("AWT Text Area");

		final Panel p = new Panel(new BorderLayout());
		p.add(tf, BorderLayout.CENTER);
		p.add(textArea, BorderLayout.SOUTH);
		f.add(p);
		f.pack();



		f.addWindowListener(new WindowAdapter() {

		 @Override
		  public void windowClosing(WindowEvent e) {
		    System.exit(0);
		  }
		});

		f.setVisible(true);

		while (true) {
			try {
				Thread.sleep(3000);
			} catch (InterruptedException e1) {

				e1.printStackTrace();
			}

			if(textArea.getText().length() == 0)
			{

			textArea.setText(tf.getText());
			}else{
				textArea.setText(textArea.getText() + "\n" + tf.getText());
			}

		}[/HIGHLIGHT]


Der Code ist nicht der schönste, weiß ich aber soll ja nur das Ergebnis zeigen. Einfach was oben in das Textfield schreiben und ein paar Sekunden warten .


----------



## Ebenius (27. Mrz 2009)

Bei mir funktioniert das Beispiel.

Ich benutze normaler Weise kein nackeliges AWT. Kann das Problem daran liegen, dass man unter Windows (hab keins hier) "\r\n" nehmen muss? BTW: In dem Beispiel sollte man noch mit dem TreeLock synchronisieren. Probier mal so: [Highlight=Java]public static void main(String[] args) {
  final TextArea textArea = new TextArea();
  final TextField tf = new TextField();

  final Frame f = new Frame("AWT Text Area");

  final Panel p = new Panel(new BorderLayout());
  p.add(tf, BorderLayout.CENTER);
  p.add(textArea, BorderLayout.SOUTH);
  f.add(p);
  f.pack();

  f.addWindowListener(new WindowAdapter() {

    @Override
    public void windowClosing(WindowEvent e) {
      System.exit(0);
    }
  });

  f.setVisible(true);

  while (true) {
    try {
      Thread.sleep(3000);
    } catch (InterruptedException e1) {

      e1.printStackTrace();
    }

    synchronized (textArea.getTreeLock()) {
      if (textArea.getText().length() == 0) {
        textArea.setText(tf.getText());
      } else {
        textArea.setText(textArea.getText()
              + System.getProperty("line.separator")
              + tf.getText());
      }
    }
  }
}[/Highlight]
Ebenius


----------



## Skull (27. Mrz 2009)

Ja so gehts.....also dein erstes Beispiel ging bei mir auch, nur mein eigenes Beispiel nicht ???:L.

Werde jetzt deine abgeänderte Version verwenden, danke .


----------



## Ebenius (27. Mrz 2009)

Da fällt mir ein: Besser als der synchronized-Block ist EventQueue.invokeLater(...) zu verwenden.

Ebenius


----------



## Skull (27. Mrz 2009)

Ich hab einfach die Methode um Ergebnisse hinzuzufügen synchronized gemacht (die werden von außen übergeben). Das sollte doch im Prinzip ausreichen?


----------



## Ebenius (27. Mrz 2009)

Skull hat gesagt.:


> Ich hab einfach die Methode um Ergebnisse hinzuzufügen synchronized gemacht (die werden von außen übergeben). Das sollte doch im Prinzip ausreichen?


Nein. Das ganze muss synchron zum TreeLock (also zum Event Dispatcher) passieren und nicht synchron zur Instanz Deiner Klasse. Siehe Sun Java™ Tutorial: Concurrency.

Ebenius


----------

