У меня есть следующие требования:
Мне нужна прокручиваемая JTextPane. Пользователь может ввести текст в эту текстовую область, или в нее может быть вставлен текст, который не был введен пользователем. Подумайте о чем-то вроде окна обмена мгновенными сообщениями. Хотя окно должно быть прокручиваемым, чтобы пользователь мог просмотреть ранее набранный текст, курсор никогда не должен перемещаться со своей позиции в конце текста. Любой текст, введенный пользователем, всегда будет отображаться в конце.
В JTextPane, когда пользователь прокручивает полосу прокрутки, курсор не перемещается. Область просмотра настроена. Однако, когда пользователь нажимает клавиши со стрелками вверх и вниз, курсор JTextPane перемещается вместе с ним (независимо от того, прокручивается окно или нет).
Я хочу, чтобы клавиша со стрелкой вверх функционировала так же, как перемещение полосы прокрутки вверх с помощью мыши. Клавиши со стрелками не должны иметь ничего общего с кареткой.
Я безуспешно пробовал следующие подходы: 1) добавить действие «Нет операции» в раскладку для моего класса текстовой панели (используя JTextPane.addKeymap() и Keymap.addActionForKeyStroke()). Это останавливает перемещение каретки, но предотвращает передачу действия на панель прокрутки для прокрутки представления. 2) удалить клавиши со стрелками из раскладки для моего класса текстовой панели. Это влияет на все JTextPanes в моем приложении, чего я не хочу.
Я хочу добавить действие к моей раскладке TextPane, которое просто вызывает действие ScrollPane для стрелок вверх и вниз.
Каков наилучший способ добиться этого?
Мне приходит в голову возможность реализовать KeyListener (который получает нажатие клавиши перед раскладкой), чтобы перехватывать эти клавиши, а затем выполнять прокрутку вручную. Но это, похоже, потребует от меня вычисления размеров шрифта и т. д. Есть ли более простой способ?
В идеале было бы, если бы был какой-то способ «привязать» курсор к любому концу текста.