Java Swing - Verwenden von JScrollPane und Scrollen nach oben

82

Ich verwende JScrollPane, um das Scrollen in einem JFrame mit einer Textkomponente zu ermöglichen, die als Texteditor dient. Nachdem ich den Text in diesem Editor festgelegt habe, möchte ich ihn wieder nach oben scrollen lassen, damit Sie sehen können, was sich am Anfang der Datei befindet.

Weiß jemand, wie man das macht?


quelle

Antworten:

137

Wenn Sie setCaretPosition (0) für Ihre Textkomponente aufrufen, wird diese nach oben gescrollt .

Craig
quelle
Sie haben Recht, das Problem war, dass sich das Caret am Ende der Textkomponente befand. Es funktioniert auch nach dem Aufruf von 'setText (...)' im Texteditor. (getestet mit einer JEditorPane-Instanz als Textfenster im JScrollPane).
Guillaume
36

Nur für den Fall, dass Sie keine Textkomponente verwenden, werfen Sie einen Blick auf den hier veröffentlichten Thread .... Festlegen der Bildlaufleiste in einem JScrollPane

Ihre Lösung besteht darin, einen Thread über invokeLater abzuspinnen

final JScrollPane scroll = new JScrollPane(text);
javax.swing.SwingUtilities.invokeLater(new Runnable() {
   public void run() { 
       scroll.getVerticalScrollBar().setValue(0);
   }
});
Eric Warriner
quelle
1
Dies ist die beste Antwort auf meine Frage. Stackoverflow.com/questions/42961012/… Wie kann diese Methode jedoch verwendet werden, wenn sich in JScrollPane ein Panel befindet?
In-junge Choung
3
invokeLaterspinnt keinen Thread ab, sondern stellt nur ein Ereignis in die Warteschlange, das nach dem aktuellen Ereignis ausgeführt werden soll (z. B. Klicken auf eine Schaltfläche oder was auch immer der Kontext des invokeLateraufrufenden Codes ist ), und alle anderen bereits in die Warteschlange gestellten Ereignisse werden beendet.
Radiodef
10

Dies wird die Arbeit machen:

DefaultCaret caret = (DefaultCaret) textArea.getCaret();
caret.setUpdatePolicy(DefaultCaret.NEVER_UPDATE);
Pb600
quelle
9

Sie können die Methode setCaretPosition(0)direkt nach setText(String t)Ihrer Textkomponente verwenden.

Aosphym
quelle
1
Kopie der früheren Antwort von @ Craig.
Karl Richter
7

Sie können dies versuchen:

 scrollPane.getViewport().setViewPosition(new Point(0,0));

Laut JavaDocs verhält sich setViewPosition () folgendermaßen:

Legt die Ansichtskoordinaten fest, die in der oberen linken Ecke des Ansichtsfensters angezeigt werden, und führt nichts aus, wenn keine Ansicht vorhanden ist.

Vincent Ramdhanie
quelle
4
Das hat bei mir nicht funktioniert - das ScrollPane springt nach oben und fällt sofort wieder nach unten.
Jwoolard
Es hat bei mir funktioniert ¯ \ _ (ツ) _ / ¯ Ich habe eine JTable in meinem JScrollPane.
Mikato
@jwoolard Ja, die hier vorgestellte Lösung funktioniert in einigen Fällen, auf die ich gestoßen bin, nicht. ABER, nehmen Sie die Lösung zur Kenntnis, die ich heute Morgen gestellt habe.
Richard T
2

Hier ist wie:

textArea.setSelectionStart(0);
textArea.setSelectionEnd(0); 
Richard T.
quelle