JScrollPane автоматически прокручивает вниз при динамическом добавлении JPanels

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

Проведены тесты

Все существующие решения относятся к JTextArea или JList. Приведенное ниже решение работает, но имеет проблему с переопределением всех действий пользователя (если мы вручную нажмем на ScrollBox, после этого он автоматически прокрутится вниз):

@Override
public void adjustmentValueChanged(AdjustmentEvent e){
    e.getAdjustable().setValue(e.getAdjustable().getMaximum()); 
}

Я пробовал это решение:

private void addPanel(JPanel newPanel){
     scrollPanel.add(newPanel);
     scrollDown(); 
}

private void scrollDown(){
    JScrollBar vertical = scroll.getVerticalScrollBar();
    vertical.setValue(vertical.getMaximum());
}

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


person Kapcash    schedule 28.08.2016    source источник


Ответы (1)


После попытки понять, почему мое второе решение не работает полностью, я напечатал значение (высокое) полосы прокрутки, чтобы увидеть, когда оно будет обновлено с помощью scrollPane.getVerticalScrollBar().getValue();.

Это значение обновляется не сразу после добавления JPanel, а при следующем вызове addPanel() (то есть со смещением).

Мне просто нужно было вызвать метод revalidate() для всего моего окна/frame, чтобы все заработало.

private void scrollDown(){
    window.revalidate(); //Update the scrollbar size
    JScrollBar vertical = scroll.getVerticalScrollBar();
    vertical.setValue(vertical.getMaximum());
}

Примечание. Если вы повторно проверяете только JScrollPane, это не сработает.

person Kapcash    schedule 28.08.2016