Подтвердить что ты не робот

Прокрутка JScrollPane донизу

Мне нужно прокрутить JScrollPane до конца. JScrollPane содержит JPanel, который содержит несколько JLabel.

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

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

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

4b9b3361

Ответ 1

JScrollBar vertical = scrollPane.getVerticalScrollBar();
vertical.setValue( vertical.getMaximum() );

Ответ 2

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

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

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

public void printMessage(String message)
{
    textArea.append(message + endL);
    textArea.setCaretPosition(textArea.getDocument().getLength());
}

Ответ 3

scrollPane.getVerticalScrollBar().addAdjustmentListener(new AdjustmentListener() {  
    public void adjustmentValueChanged(AdjustmentEvent e) {  
        e.getAdjustable().setValue(e.getAdjustable().getMaximum());  
    }
});

Ответ 4

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

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

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

Ответ 5

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

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

Ответ 6

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

JScrollPane.getViewport().setViewPosition(new Point(0,JTextArea.getDocument().getLength()));

Ответ 7

// Scroll to bottom of a JScrollPane containing a list of Strings.

JScrollPane      scrollPane;
DefaultListModel listModel;
JList            list;

listModel = new DefaultListModel();

list = new JList(listModel);
list.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
list.setLayoutOrientation(JList.VERTICAL);
list.setVisibleRowCount(-1); // -1 = display max items in space available

scrollPane = new JScrollPane(list);
scrollPane.setPreferredSize(new Dimension(200, 50));

// Append text entries onto the text scroll pane.
listModel.addElement("text entry one");
listModel.addElement("text entry two");
listModel.addElement("text entry three");
listModel.addElement("text entry four");

// Get the index of the last entry appended onto the list, then
// select it, and scroll to ensure it is visible in the vewiport.
int lastNdx = listModel.getSize() - 1;
list.setSelectedIndex(lastNdx);
list.ensureIndexIsVisible(lastNdx);

JPanel panel = new JPanel();
panel.add(scrollPane);

Ответ 8

Я попробовал несколько методов. Некоторые используют 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();
}

Ответ 9

Если вы посмотрите документацию JTextArea

public void select (int selectionStart,                  int selectionEnd)

Выбор текста между указанными начальными и конечными позициями. Этот метод устанавливает начальную и конечную позиции выбранного текста, применяя ограничение, согласно которому начальная позиция должна быть больше или равна нулю. Конечная позиция должна быть больше или равна начальной позиции и меньше или равна длине текста текстового компонента.

Если вызывающий объект передает значения, которые являются несогласованными или выходящими за пределы, метод принудительно отключает эти ограничения и без сбоев. В частности, если начальная позиция или конечная позиция больше длины текста, то reset равна длине текста. Если начальная позиция меньше нуля, то она равна reset, а если конечная позиция меньше начальной позиции, то она находится в состоянии reset.

Таким образом, простым решением является jTextArea.select(Integer.MAX_VALUE, 0); и пусть Java разбирается!