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


82

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

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

java  swing 

Ответы:


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

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 Да, представленное здесь решение не работает в ряде случаев, с которыми я сталкивался. НО, обратите внимание на решение, которое я предложил сегодня утром.
Ричард Т.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.