JScrollPane - Balkenposition

Hallo,
kann man die Scroll-Balken-Position (vertikal) eines JScrollPane’s bestimmen/festlegen? Wenn der Scroll-Balken aktiv ist, ist er immer am unteren Ende, besser wäre es wenn er auf Anfang stehen würde. Kann man das irgendwie machen?

Also bei der eingebetteten JTextArea habe ich die CaretPosition auf 0 gesetzt, das hat mein Problem aber nicht gelöst…die Balken sind trotzdem immer ganz unten… :frowning:

Versuch’s mal so:

    private JScrollBar bar;
...
        bar = jScrollPane1.getVerticalScrollBar();
..
    private void scrollToTop() {//we could call this for example after each texarea update
        SwingUtilities.invokeLater(new Runnable() {

            public void run() {
                bar.setValue(0);
            }
        });
    }
...```

Warum wird SwingUtilities.invokeLater(new Runnable() { … } und nicht einfach nur die ScrollBar mit setValue(0) verwendet?

Damit die Reihenfolge stimmt:

  1. Den aktualisierten Text sichtbar machen.
  2. Die Scrollbar gemäss dem dann sichtbaren Text setzen

Beim Wert 0 ist es vielleicht nicht nötig, das kann schon sein.
Aber allgemein orientiert sich die Scrollbar am sichtbaren Text :wink:

In welchen Fällen sollte man die invokeLater() methode nutzen.
Kannst Du da etwas allgemeingültiges nennen?

[QUOTE=SeannWilliamScott]In welchen Fällen sollte man die invokeLater() methode nutzen.
Kannst Du da etwas allgemeingültiges nennen?[/QUOTE]
In Swing heißt der Thread, welcher der graphischen Anzeige gewidmet ist, der „Event Dispatch Thread“, kurz EDT. Man kann sich den Code, der im EDT läuft als eine Reihe von kurzen Aktionen vorstellen. Meistens handelt es sich um Methoden des Eventhandling, wie z.B. ActionListener.actionPerformed. Andere Aktionen können vom Code der Anwendung auf den EDT geschickt werden, idem sie invokeLater (oder invokeAndWait) benutzen. Alles, was die graphische Anzeige verändert, muss auf dem EDT ausgeführt werden.
Falls die Aktionen in einer bestimmten Reihenfolge durchzuführen sind, braucht man nur jede einzelne von ihnen in ein „invokeLater“ Konstrukt zu packen; sie werden dann garantiert nacheinander in der Aufrufreihenfolge ausgeführt. Aktionen im EDT müssen aber auch jeweils schnell zu Ende kommen; andernfalls bleiben die nachfolgenden Events unerledigt in der Warteschlange, und die Anzeige blockiert.

Und warum soll, bei Vril’s Problem nur die scrollbar.setValue(0); in invokeLater() rein? Was könnte passieren, wenn er es ohne invikeLater macht? Ich meine, wenn etwas zu dem Text im TextArea geadded wird, dann wird das doch sicher vor der scrollbar.setValue(0); Methode ausgeführt. Oder?

Nicht unbedingt. Wenn wir nicht auf dem EDT sind (SwingUtilities.isEventDispatchThread() ist falsch), dann könnten wir mit append Text hinzufügen. „append“ ist thread safe un wird somit auf den EDT geschickt. Würden wird scrollbar.setValue nicht mit invokeLater aufrufen, dann wären die beiden Methoden nicht synchronisiert :wink:

Vielen Dank!!! Also ich habe es jetzt so gemacht:

  1. JScrollPane eingebaut
  2. Text reingefüllt
  3. und jetzt die CaretPosition auf 0 gesetzt

Jetzt klappt es!