Настройка поведения прокрутки + каретки в JTextArea + JScrollPane - PullRequest
2 голосов
/ 30 августа 2011

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

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

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

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

1 Ответ

2 голосов
/ 31 августа 2011

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

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

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

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