Сделайте прокрутку JScrollPane до конца, НО всегда слева, а не в конце - PullRequest
0 голосов
/ 25 мая 2018

Мой JScrollPane может прокручивать до конца каждый раз, когда текст добавляется к JTextArea, используя следующий код:

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

Однако, если текст слишком длинный и не помещается в видимой областичасть поля, она прокручивается вправо (буквальный конец текстовой области).

Есть ли способ игнорировать горизонтальное изменение текста и просто автоматически прокручивать по вертикали (сохраняя текущие горизонтальные столбцы просматриваемыми).Либо так, либо всегда слева.

Ответы [ 2 ]

0 голосов
/ 25 мая 2018

Вам нужно будет вручную отрегулировать положение области просмотра.Таким образом, вы можете создать метод append (...) с кодом, похожим на:

public void append(JTextArea textArea, String text)
{
    textArea.append( text );

    Component parent = textArea.getParent();

    if (parent instanceof JViewport)
    {
        JViewport viewport = (JViewport)parent;
        Point p = viewport.getViewPosition();

        if (p.x != 0)
        {
            p.x = 0;
            viewport.setViewPosition( p );
        }
    }
}

Или вместо изменения позиции просмотра вы можете сбросить каретку в начало строки, что должно привести к тому, что область просмотра будетсброс влево автоматически:

textArea.append( text );
textArea.setCaretPosition( Utilities.getRowStart(textArea, textArea.getCaretPosition() ); 
0 голосов
/ 25 мая 2018

Если у вас есть что-то вроде append(String) метода, который позволяет вам легко добавлять вещи к вашему JTextArea, то вы также можете обновить эту область следующим образом:

public void append(String s) {
    area.append(s.endsWith("\n") ? s : s + "\n"); // your choice here
    area.setCaretPosition(Math.max(area.getText().lastIndexOf("\n"), 0)); // update pos
}

Какойпоместит каретку в конце \n в тексте.

...