Создание JScrollPane автоматической прокрутки до упора вниз

StackOverflow https://stackoverflow.com/questions/2483572

Вопрос

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

Это было полезно?

Решение

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

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

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

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

Другие советы

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

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

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

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

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

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

Вот решение.

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

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

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

Alternative SC Link (ПС:Редактирование для СЪЕМКИ ЭКРАНА)

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

    }

}

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top