Java Swing - Korzystanie z JScrollPane i przewijanie z powrotem do góry

82

Używam JScrollPane, aby umożliwić przewijanie w JFrame, który ma składnik tekstowy, który służy jako edytor tekstu. Po ustawieniu tekstu w tym edytorze chcę go przewinąć z powrotem do góry, abyś mógł zobaczyć, co jest na początku pliku.

Czy ktoś wie, jak to zrobić?


źródło

Odpowiedzi:

136

Wywołanie setCaretPosition (0) w komponencie tekstowym spowoduje jego przewinięcie do góry.

Craig
źródło
Masz rację, problem polegał na tym, że daszek znajdował się na końcu komponentu tekstowego. Działa również po wywołaniu „setText (...)” w edytorze tekstu. (testowane z instancją JEditorPane jako panelem tekstowym wewnątrz JScrollPane).
Guillaume,
37

Na wypadek, gdybyś nie korzystał z komponentu tekstowego, spójrz na zamieszczony tutaj wątek .... Ustawianie paska przewijania w JScrollPane

Ich rozwiązaniem jest wyodrębnienie wątku za pomocą invokeLater

final JScrollPane scroll = new JScrollPane(text);
javax.swing.SwingUtilities.invokeLater(new Runnable() {
   public void run() { 
       scroll.getVerticalScrollBar().setValue(0);
   }
});
Eric Warriner
źródło
1
To jest najbliższa odpowiedź na moje pytanie. Stackoverflow.com/questions/42961012/… Jednak jak można użyć tej metody, jeśli w JScrollPane znajduje się panel?
In-young Choung
3
invokeLaternie wydziela wątku, po prostu kolejkuje zdarzenie, które ma być wykonane po bieżącym zdarzeniu (np. kliknięciu przycisku lub jakimkolwiek kontekście wywoływanego kodu invokeLater) i zakończeniu innych już zakolejkowanych zdarzeń.
Radiodef
10

To sprawi, że praca:

DefaultCaret caret = (DefaultCaret) textArea.getCaret();
caret.setUpdatePolicy(DefaultCaret.NEVER_UPDATE);
Pb600
źródło
9

Możesz użyć tej metody setCaretPosition(0)zaraz po setText(String t)komponencie tekstowym.

aosphyma
źródło
1
Kopia wcześniejszej odpowiedzi @ Craiga.
Karl Richter,
7

Możesz spróbować tego:

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

Zgodnie z JavaDocs setViewPosition () zachowuje się następująco:

Ustawia współrzędne widoku, które pojawiają się w lewym górnym rogu rzutni, nic nie robi, jeśli nie ma widoku.

Vincent Ramdhanie
źródło
4
To nie zadziałało - ScrollPane przeskakuje na górę, a następnie natychmiast ponownie opada na dół.
jwoolard
U mnie zadziałało ¯ \ _ (ツ) _ / ¯ Mam JTable w moim JScrollPane.
mikato
@jwoolard Tak, przedstawione tutaj rozwiązanie nie działa w wielu przypadkach, z którymi się spotkałem. ALE, zwróć uwagę na rozwiązanie, które postawiłem dziś rano.
Richard T
2

Oto jak:

textArea.setSelectionStart(0);
textArea.setSelectionEnd(0); 
Richard T.
źródło