Настройка поведения прокрутки + каретки в JTextArea+JScrollPane

У меня проблема с реализацией нужного мне поведения в упомянутых компонентах. Поведение, которое я хочу, это:
1) По умолчанию, когда новый контент добавляется в JTextArea, он автоматически прокручивается до последней вставленной строки. Это мне удалось сделать с:
DefaultCaret caret = (DefaultCaret)textArea.getCaret(); caret.setUpdatePolicy(DefaultCaret.NEVER_ALWAYS);
2) Когда пользователь с помощью мыши или клавиатуры перемещает полосу прокрутки, автоматическая прокрутка должна быть отключена, и отображается текст, к которому прокручивался пользователь (здесь я попытался реализовать AdjustmentListener, который по действию настраивал DefaultCaret.NEVER_NEVER но после установки его НИКОГДА, я никогда не смогу прокрутить куда-нибудь еще)
3) Когда пользователь перемещает полосу прокрутки к последней вставленной строке, поведение по умолчанию, упомянутое в строке 1), должно быть восстановлено

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

Спасибо, Сергей.

РЕДАКТИРОВАТЬ: я нашел очень похожий вопрос и ответ на него с примером исходного кода. Ответ можно найти здесь

1 ответ

Это не полный ответ, но область комментариев слишком ограничена;-)

Я предполагаю, что если вы действительно хотите подключиться к поведению полосы прокрутки, вам придется играть очень грязно и перехватывать MouseListener, установленный с помощью пользовательского интерфейса, и оборачивать действия полосы прокрутки по умолчанию (в ActionMap) своими собственными и реализовывать переключение политика карета там.

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

  • для остановки автоматической прокрутки: отодвиньте каретку от конца
  • для автоматической прокрутки: переместите каретку до конца
Другие вопросы по тегам