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?

java  swing 

Antworten:


137

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


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);
   }
});

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);

9

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


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.


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); 
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.