Java Swing - использование JScrollPane и его прокрутка вверх

82

Я использую JScrollPane, чтобы разрешить прокрутку в JFrame, в котором есть текстовый компонент, который служит текстовым редактором. Что я хочу сделать после установки текста в этом редакторе, так это прокрутить его обратно вверх, чтобы вы могли видеть, что находится в начале файла.

Кто-нибудь знает как это сделать?


источник

Ответы:

136

Вызов setCaretPosition (0) в текстовом компоненте приведет к его прокрутке вверх.

Крейг
источник
Вы правы, проблема была в том, что каретка была в конце текстового компонента. Он также работает после вызова setText (...) в текстовом редакторе. (протестировано с экземпляром JEditorPane в качестве текстовой панели внутри JScrollPane).
Гийом
37

На всякий случай, если вы не используете текстовый компонент, посмотрите ветку, размещенную здесь .... Установка полосы прокрутки на JScrollPane

Их решение - отключить поток через invokeLater

final JScrollPane scroll = new JScrollPane(text);
javax.swing.SwingUtilities.invokeLater(new Runnable() {
   public void run() { 
       scroll.getVerticalScrollBar().setValue(0);
   }
});
Эрик Уорринер
источник
1
Это наиболее близкий ответ на мой вопрос .. stackoverflow.com/questions/42961012/… Однако как можно использовать этот метод, если внутри JScrollPane есть панель?
In-Young Choung
3
invokeLaterне отключает поток, он просто ставит в очередь событие, которое должно быть выполнено после текущего события (например, нажатие кнопки или что-то еще, что является контекстом кода, который вызывает invokeLater), и завершаются любые другие уже поставленные в очередь события.
Radiodef 02
10

Это сделает работу:

DefaultCaret caret = (DefaultCaret) textArea.getCaret();
caret.setUpdatePolicy(DefaultCaret.NEVER_UPDATE);
Pb600
источник
9

Вы можете использовать метод setCaretPosition(0)сразу после setText(String t)текстового компонента.

аофима
источник
1
Копия предыдущего ответа @ Craig.
Карл Рихтер
7

Вы можете попробовать это:

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

Согласно JavaDocs setViewPosition () ведет себя следующим образом:

Устанавливает координаты представления, которые отображаются в верхнем левом углу области просмотра, ничего не делает, если представления нет.

Винсент Рамдхани
источник
4
У меня это не сработало - ScrollPane прыгает вверх, а затем сразу же снова опускается вниз.
jwoolard
У меня это сработало ¯ \ _ (ツ) _ / ¯ У меня есть JTable внутри JScrollPane.
mikato
@jwoolard Да, представленное здесь решение не работает в ряде случаев, с которыми я сталкивался. НО, обратите внимание на решение, которое я предложил сегодня утром.
Ричард Т.
2

Вот как:

textArea.setSelectionStart(0);
textArea.setSelectionEnd(0); 
Ричард Т
источник