Создание JScrollPane автоматически прокручивает все вниз - PullRequest
18 голосов
/ 20 марта 2010

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

Ответы [ 7 ]

37 голосов
/ 20 марта 2010

Для (как мне кажется) более простого ответа проверьте: Прокрутка текстовой области .

До JDK5 вам придется вручную менять позицию каретки после каждого добавления. Теперь вы можете настроить это поведение по умолчанию следующим образом:

 JTextArea textArea = new JTextArea();
 DefaultCaret caret = (DefaultCaret)textArea.getCaret();
 caret.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE);

Преимущество этого заключается в том, что вам не нужно использовать этот фрагмент более одного раза в коде!

7 голосов
/ 20 марта 2010

Я нашел ответ здесь: Автопрокрутка JScrollPane и JList

scrollPane.getVerticalScrollBar().addAdjustmentListener(new AdjustmentListener() {  
        public void adjustmentValueChanged(AdjustmentEvent e) {  
            e.getAdjustable().setValue(e.getAdjustable().getMaximum());  
        }
    });
6 голосов
/ 04 января 2014

Вот решение.

JTextArea textArea = new JTextArea();
DefaultCaret caret = (DefaultCaret)textArea.getCaret();
caret.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE);` 
6 голосов
/ 14 июля 2012

Если вы постоянно записываете в него данные, вы можете использовать:

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

сразу после добавления новых данных.

Это автоматически прокручивает все вниз по JScorllPane.

1 голос
/ 09 сентября 2011

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

0 голосов
/ 27 сентября 2018

Принятое решение работает хорошо, но только когда текстовая область редактируема, то есть без jTextArea.setEditable(false). Решение, предложенное Krigath , является более общим, но имеет проблему, как указано здесь JScrollPane и JList auto scroll . Используя ответы на этот вопрос, вы можете получить общее решение, например ::10000

        JScrollPane scrollPane = new JScrollPane(jTextArea);

    verticalScrollBarMaximumValue = scrollPane.getVerticalScrollBar().getMaximum();
    scrollPane.getVerticalScrollBar().addAdjustmentListener(
            e -> {
                if ((verticalScrollBarMaximumValue - e.getAdjustable().getMaximum()) == 0)
                    return;
                e.getAdjustable().setValue(e.getAdjustable().getMaximum());
                verticalScrollBarMaximumValue = scrollPane.getVerticalScrollBar().getMaximum();
            });

Панель прокручивается вниз, только когда вертикальная полоса прокрутки расширяется, в ответ на добавленные строки текста.

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

0 голосов
/ 20 декабря 2017

Мое решение Screen Shoot

Alternative SC Link (PS: отредактировать для экрана съемки)

import javax.swing.*;
import javax.swing.text.DefaultCaret;

public class NewClass {

    public static void main(String[] args) {
        JFrame win = new JFrame("test");
        win.setSize(800, 500);
        win.setResizable(false);
        win.setLayout(null);
        win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        win.setLocationRelativeTo(null);

        JTextArea txtListNum = new JTextArea();
        JScrollPane barList = new JScrollPane(txtListNum);
        DefaultCaret crList = (DefaultCaret) txtListNum.getCaret();
        crList.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE);

        barList.setLocation(10, 10);  // Scrollbar Position
        barList.setSize(180, 450);   // Scrollbar Dimession
        win.add(barList);            // Scrolbar add to Frame

        win.setVisible(true);

    }

}
...