JScrollPane automatisch nach unten scrollen

DarthShader

Erfahrenes Mitglied
Hallo,

ich habe eine JScrollPane, darin ein JPanel, welches ich mit weiteren Componenten dynamisch fülle. Da ich eben dieses Panel fülle, taucht irgendwann die vertikale Scrollleiste vom JScrollPane auf, das ist natürlich klar und soll auch so sein, damit ich den Inhalt nach unten scrollen kann.

Was ich nun aber erreichen möchte, ist das programmiertechnische, also automatische scrollen bis ans Ende (unten), damit alle neu hinzugefügten Komponenten sofort sichtbar sind (ähnlich einem Chatfenster, das auch automatisch nach unten scrollt).

Dies bekomme ich jedoch einfach nicht hin. Ich habe es bisher so versucht, genau nachdem ich eine Komponente dem Panel hinzugefügt habe, und damit auch die vertikale Scrollbar aufgetaucht ist:

Java:
// Referenz auf das scrollbar objekt holen
JScrollBar vsb = jScrollPane1.getVerticalScrollBar();

// Zum debuggen die aktuellen werte der scrollbar ausgeben
System.out.println( "current: " + vsb.getValue() );
System.out.println( "max:     " + vsb.getMaximum() );
System.out.println( "extent:  " + vsb.getVisibleAmount() );

// Versuchen, ganz nach unten zu scrollen:
vsb.setValue( vsb.getMaximum() - vsb.getVisibleAmount() );

Leider funktioniert es so nicht. Die scrollbar scrollt zunächst gar nicht, wenn dann mehr Komponenten hinzu kommen und damit vsb.getMaximum() immer größer wird, scroll die Bar ein kleines Stückchen nach unten, aber auf keinen Fall ganz. Ich kann nicht nachvollziehen, was da passiert.

Ist mein Ansatz, zu scrollen, falsch? Habe ich irgendetwas vergessen, oder macht man es gänzlich anders?

Ich würde mich über Hilfe sehr freuen


Vielen Dank!
 
Hi,

das Problem ist, dass der neu hinzugefügt teil von getMaximum() noch nicht abgedeckt wird. Ich habe herausgefunden, dass die scrollbar auf diese art und weise immer auf den vorletzten eintrag runterscrollt, jedoch nicht zum letzten.
habe dafür noch keine lösung.

nach vielem herumsuchen bin ich aber immer wieder auf die methode getviewport von jscrollpane gestoßen, jedoch bin ich noch nicht ganz dahinter gestiegen, wie es so funktionieren soll.

Viele Grüße,
BigManu
 
Zuletzt bearbeitet:
Hi wenn da jemanden interesieren wurde es geht so :

mann mus bei der
Code:
this.getJScrollPane().getVerticalScrollBar().setValue(text.length());


wobei der "text" ist eine Varaible welche ich in eine JEditPane , die sich in JScrollPane befindet , in setTex(text) reingebe.
 
Folgende Lösung:
(unter der Vorraussetzung das die schreibende Funktion ein eigenständiger Thread ist )

Code:
public void setStatus(String i){
            // Liest vorhandenes Textfeld ein und erweitert es um die Zeile i als String
            this.jTextArea1.setText(jTextArea1.getText()+"\n"+i);
            // erhöht die Anzahl der Zeilen im Textfeld um 1 
            this.jTextArea1.setRows(this.jTextArea1.getRows()+1);
            // setzt ScrollPane Wert auf den Maximalbezugswert des inneligenden contents (minimalwert ScrollPane  + Anzahl der Zeilen im Textarea)
            jScrollPane1.getVerticalScrollBar().getModel().setValue(jScrollPane1.getVerticalScrollBar().getModel().getValue()+jTextArea1.getRows());
            this.validate();
            this.repaint();
        }
    }

Scrollt immer nach unten. Scrollpane bezieht sich immer auf seinen Content (soweit der Bekannt ist), in diesem Fall jTextArea->Row.
 
Zurück