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

Автоматическая прокрутка текста для текстовой области (JTextArea) с позицией каретки, установленной в начале последней строки

У меня есть простой вопрос Java здесь. Я хочу, чтобы автоматический текст прокручивался до начала последней строки текстовой области, созданной с помощью JTextArea. Количество текста на строку текстовой области довольно длиннее ширины текстовой области.

Вот фрагмент кода, который я использовал для настройки.

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

Теперь проблема заключается в том, что с приведенным выше кодом поведение по умолчанию состоит в том, что каретка автоматически позиционируется в конце документа, в результате начальная часть всей текстовой области выходит из области видимости. Я бы предпочел, чтобы автоматический прокрутка произошла с началом последней строки в документе.

Чтобы было ясно, вот два снимка экрана,

То, что я хочу, является первым, но то, что происходит, является вторым.

What I want is thisWhat I get is this

4b9b3361

Ответ 1

Просто переместите курсор в нужное место с помощью getLineCount и getLineStartOffset после обновления текста текстового поля.

Вот рабочий пример, иллюстрирующий ваше желаемое поведение:

import java.util.List;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;
import javax.swing.SwingWorker;
import javax.swing.text.BadLocationException;
import javax.swing.text.DefaultCaret;

public class Test {

    private JFrame frame;
    private JTextArea ta;

    protected void initUI() {
        frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        ta = new JTextArea();
        DefaultCaret caret = (DefaultCaret) ta.getCaret();
        caret.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE);
        frame.add(new JScrollPane(ta));
        frame.setSize(400, 200);
        frame.setVisible(true);
        new UpdateText().execute();
    }

    class UpdateText extends SwingWorker<String, String> {

        @Override
        public String doInBackground() {
            for (int i = 0; i < 1000; i++) {
                publish("Hello-" + i);
                try {
                    Thread.sleep(500);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            return null;
        }

        @Override
        public void process(List<String> chunks) {
            for (String s : chunks) {
                if (ta.getDocument().getLength() > 0) {
                    ta.append("\n");
                }
                ta.append(s);
            }
            try {
                ta.setCaretPosition(ta.getLineStartOffset(ta.getLineCount() - 1));
            } catch (BadLocationException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

        @Override
        public void done() {

        }
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                new Test().initUI();
            }
        });
    }

}