# JList in JScrollPane -> ScrollBar ans Ende setzen



## h4ck4 (10. Jan 2010)

Hi,
ich habe schon in api geschaut und mir was cooles überlegt....allerdings weiß ich beim besten willen nicht, warums net klappt :-(


```
JScrollPane jScrollPane = new JScrollPane();
jScrollPane.getVerticalScrollBar().setValue(jScrollPane.getVerticalScrollBar().getMaximum());
```

Hat jmd eine Idee, wieso es nicht funktionieren kann?? Der ScrollBalken ist immer nur minimal tiefer, aber nicht wie ich will am Ende ???:L

Oder gibt es eine bessere elegantere Lösung??

Danke schonmal im voraus ;-)


----------



## Firestorm87 (11. Jan 2010)

Ich habe gerade leider weder eine schöne Idee zur Hand, noch eine möglichkeit das zu testen (bin nicht ZuHaus), aber hast du mal

[Java]jScrollPane.getVerticalScrollBar().setValue(Integer.MAX_VALUE);[/code]

versucht?

Gruß

Firestorm


----------



## SlaterB (11. Jan 2010)

bei derartigen Aktualisierungen habe ich auch Probleme, wenn gleichzeitig der Inhalt der ScrollPane geändert wird,
dann verwende ich einen Thread, der erst 30 ms wartet und dann setValue() aufruft, vorher hat das wenig Auswirkungen

falls jemand dazu genauere Details erzählen möchte, wäre ich auch interessiert


----------



## max40 (11. Jan 2010)

ich hätte es so gemacht:

```
EventQueue.invokeLater(new Runnable() {
	public void run() {
		pane.getVerticalScrollBar().setValue(list.getHeight());
	}
});
```


----------



## h4ck4 (12. Jan 2010)

Die zwei ersten Vorschläge haben nicht funktioniert :-(
Bei dem Dritten, weiß ich leider nicht wie ich diesen EventQueue mit dem runnable aufrufen soll :-( Vllt nen kleiner Tipp... 
Weil der Ansatz erscheint mir nachvollziehbar....das Problem ist ja eigentlich imho, dass beim scrollbar.setValue() noch net die ganze Liste aktualisiert bzw initialisiert ist...!!


----------



## Ebenius (12. Jan 2010)

Das würde ich nicht aus Sicht der JScrollPane machen. Das sollte die Komponente selbst erledigen. Normale JComponents bieten dazu die Methode scrollRectToVisible(Rectangle) an, kompliziertere Klassen (JList, JTable, JTree) bieten hübschere Methoden an.

Um herauszufinden, _wann_ man die Komponente rollen muss, kann man einen HierarchyListener benutzen. Der informiert, wenn eine Komponente sichtbar (showing) wird.


```
list.addHierarchyListener(new HierarchyListener() {
  @Override
  public void hierarchyChanged(HierarchyEvent e) {
    if ((e.getChangeFlags() & HierarchyEvent.SHOWING_CHANGED) != 0) {
      final JList list = (JList) e.getComponent();
      final int lastRow = list.getModel().getSize() - 1;
      if (list.isShowing() && lastRow != -1) {
        list.ensureIndexIsVisible(lastRow);
      }
    }
  }
});
```
Code im Browser getippt, kleine Fehler bitte selbst beheben. 

Ebenius


----------

