# JScrollPane immer bis ganz nach unten scrollen lassen



## _mike_ (13. Sep 2005)

Hallo,

habe ne kurze (und hoffentlich einfache) Frage. Ich habe ein JTextArea, das in ein JScrollPane eingebettet ist. Der Text wird von einem anderen Thread geschrieben, wird also nicht manuell eingegeben. Nun ist es so, dass wenn mein TextArea überfüllt ist und die Scrollbalken erscheinen, der Text zwar unten angefügt wird, aber der vertikalle Balken nicht automatisch bis zur untersten Zeile heruntergescrollt wird. 

Meine Frage ist also, ob man mit einem einfachen API-Funktionsaufruf das so einstellen kann, dass der vertikalle (der horizontale ist mir unwichtig) Scrollbalken immer bis ganz nach unten heruntergescrollt wird. Habe dazu nichts in der API finden können. Ach ja, und das ganze soll auf Java 1.4 laufen .

mike


----------



## SebiB90 (13. Sep 2005)

dem textfeld ein chagelistener hinzufügen und in dem dann:

```
JScrollBar vertical = scrollPane.getVerticalScrollBar();
vertical.setValue(vertical.getMaximum());
```
so müsste es gehen, habs aber nicht getestet


----------



## Jörg (14. Sep 2005)

ich glaub sowas wie 

```
textarea.setCaretPosition(textarea.getText().length())
```
scrollt auch nach unten ...


----------



## _mike_ (14. Sep 2005)

Danke für die Antworten, habe es aber noch nicht zum Laufen gebracht, da ich einen ChangeListener nicht auf ein JTextArea anwenden kann (laut API). Habe es stattdessen mit einem CaretListener versucht, aber da ich den Text nicht manuell angebe, wird kein CaretEvent ausgelöst. Nun versuche ich explizit die Methode fireCaretUpdate(CaretEvent event) auszulösen, weiß aber nicht wie ich ein CaretEvent erzeugen soll. Mein Code sieht so aus (das ist ein Ausschnitt)

```
import java.awt.*;
import javax.swing.*;
import javax.swing.event.*;

public class PrintWindow extends JPanel implements CaretListener {
	
	private JTextArea textarea;
	
	public PrintWindow(String title) {
	
		textarea = new JTextArea();
		textarea.addCaretListener(this);
		textarea.setEditable(false);

		JScrollPane jsp = new JScrollPane(textarea);
						
		this.setLayout(new BorderLayout());
		this.add(jsp, BorderLayout.CENTER);	
	}

   // diese Methode wird extern aufgerufen, um Text ins JTextArea zu schreiben 
	public void append(String text) {
		textarea.append(text);
      // löse ein CaretEvent aus
		fireCaretUpdate( ... wie erzeuge ich hier ein CaretEvent? ... );
	}


	public void caretUpdate(CaretEvent evt) {
     // tue irgendwass, um den Text nach unten zu scrollen, z.B. 
		textarea.setCaretPosition(textarea.getText().length());
	}
	
}
```


----------



## _mike_ (14. Sep 2005)

Habe gerade das Problem gelöst und zwar indem ich alle Listener rausgeschmiessen und die Methode append() so umgeschrieben habe 

```
// diese Methode wird extern aufgerufen, um Text ins JTextArea zu schreiben
   public void append(String text) {
      textarea.append(text);
      textarea.setCaretPosition(textarea.getText().length());
   }
```

Danke für die Antworten. Übrigens falls jemand ne Antwort auf meine Frage von vorhin (wie man ein CaretListener erzeugt) weis, dann bitte posten. Würde es gerne wissen, aus reiner Neugierde.

Gruß, mike


----------



## Jörg (16. Sep 2005)

hm du meinst wie du einen Caret_Event_ erzeugst???
Weil den Listener hast ja schon gebaut gehabt ... 

Denke mal das hast du mit setCaretPosition schon getan 
Dieser Event wird doch wohl immer dann erzeugt,
wenn sich der Caret ändert, was du mit der set-Methode ja wohl explizit
tust. Du könnest jetzt einen Listener bauen und dir dein
Ergebnis im CaretListener ankucken (oder sontwas machen)

1. du appendest Text
2. änderst den Caret selbst, da dein append das nicht tut
3. die textarea registriert die caret-Änderung und feuert den CaretEvent 
4. dein caretlistener bekommt den event und du könntest dann
darauf reagieren (was du gar nicht willst, du wolltest ja nur scrollen LOL)


----------

