Прокрутите JScrollPane вниз - PullRequest
       27

Прокрутите JScrollPane вниз

44 голосов
/ 01 марта 2011

Мне нужно прокрутить JScrollPane вниз. JScrollPane содержит JPanel, который содержит несколько JLabel's.

Чтобы прокрутить вверх, я просто делаю:

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

а как мне прокрутить точно до самого дна? (Слишком далеко, и это дрожит)

Ответы [ 12 ]

103 голосов
/ 01 марта 2011
JScrollBar vertical = scrollPane.getVerticalScrollBar();
vertical.setValue( vertical.getMaximum() );
36 голосов
/ 03 апреля 2012

После многих часов попыток найти ответ, отличный от ответа с помощью метода scrollRectToVisible (), мне это удалось. Я обнаружил, что если вы используете следующий код после вывода текста в текстовую область на панели прокрутки, он автоматически сфокусируется на нижней части текстовой области.

textArea.setCaretPosition(textArea.getDocument().getLength());

Так что, по крайней мере для меня, мой метод печати выглядит так

public void printMessage(String message)
{
    textArea.append(message + endL);
    textArea.setCaretPosition(textArea.getDocument().getLength());
}
24 голосов
/ 20 сентября 2013
scrollPane.getVerticalScrollBar().addAdjustmentListener(new AdjustmentListener() {  
    public void adjustmentValueChanged(AdjustmentEvent e) {  
        e.getAdjustable().setValue(e.getAdjustable().getMaximum());  
    }
});
16 голосов
/ 01 марта 2011

Вместо setViewPosition() я обычно использую scrollRectToVisible(), как описано в Как использовать полосы прокрутки . Вы можете использовать результат соответствующего ярлыка getBounds() для требуемого Rectangle.

Добавление: @Matt отмечает в другом ответ : «Если вы будете использовать следующий код после вывода текста в текстовую область на панели прокрутки, он автоматически сфокусируется на нижней части текстовой области».

В частном случае JTextComponent также рассмотрите возможность использования setUpdatePolicy() метода от DefaultCaret до ALWAYS_UPDATE, показанного здесь .

11 голосов
/ 09 июля 2015

Я адаптировал код Питера Сайца .Эта версия оставляет полосу прокрутки работающей после завершения прокрутки вниз.

private void scrollToBottom(JScrollPane scrollPane) {
    JScrollBar verticalBar = scrollPane.getVerticalScrollBar();
    AdjustmentListener downScroller = new AdjustmentListener() {
        @Override
        public void adjustmentValueChanged(AdjustmentEvent e) {
            Adjustable adjustable = e.getAdjustable();
            adjustable.setValue(adjustable.getMaximum());
            verticalBar.removeAdjustmentListener(this);
        }
    };
    verticalBar.addAdjustmentListener(downScroller);
}
1 голос
/ 13 марта 2019

Ни один из ответов не сработал для меня.По какой-то причине мои JScrollPane не прокручивались до самого дна, даже если я все заново проверил.

Вот что у меня сработало:

SwingUtilities.invokeLater(() -> {
        JScrollBar bar = scroll.getVerticalScrollBar();
        bar.setValue(bar.getMaximum());
});
1 голос
/ 11 октября 2015

Если ваша JScrollPane содержит только JTextArea, то:

JScrollPane.getViewport().setViewPosition(new Point(0,JTextArea.getDocument().getLength()));
0 голосов
/ 31 декабря 2018
ScrollBar vertical = scrollPane.getVerticalScrollBar();
vertical.setValue( vertical.getMaximum() - 1 );

просто установите значение: vertical.getMaximum() - 1

0 голосов
/ 23 февраля 2018

Я хотел поделиться своими выводами по этому вопросу, так как мне нужен был ответ на него сегодня, и ни одно из решений здесь не сработало для меня, но я наконец нашел то, что сработало.У меня был объект JList, завернутый в JScrollPane, который я хотел прокрутить до последнего элемента после того, как все элементы были добавлены в DefaultListModel.По сути, это работает так:

JList list = new JList();
DefaultListModel listModel = new DefaultListModel();
JScrollPane listScroller = new JScrollPane(list);

public void populateList()
{
     //populate the JList with desired items...
     list.ensureIndexIsVisible(listModel.indexOf(listModel.lastElement()));
}

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

0 голосов
/ 24 февраля 2017

Я пробовал несколько методов. Некоторые используют bar.setValue(bar.getMaximum()), но максимум всегда равен 100, в то время как диапазон полосы будет намного больше 100. Некоторые используют textArea, но это не подходит для этого, поскольку в JScrollPane есть только JTable. И мне нравится метод, может быть, глупый, но эффективный.

JScrollBar bar=jsp.getVerticalScrollBar();
int x=bar.getValue();
for(int i=100;i<2000000000;i+=100)
{
    bar.setValue(i);
    if(x==bar.getValue())
        break;
    x=bar.getValue();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...