У меня есть JTextPane, сидящий в JFrame, со всплывающим меню, которое назначается JTextPane через метод JTextPane.setComponentPopupMenu.
Я хочу дать JTextPane «Word-like» всплывающее поведение. Под этим я подразумеваю, что если вы щелкнете правой кнопкой мыши за пределами текущего выделенного текста, каретка будет перемещена туда, где вы щелкнули правой кнопкой мыши, с отключенными параметрами меню, которые влияют на выделение текста (например, вырезать, скопировать или выделить жирным шрифтом). Если вы щелкнете правой кнопкой мыши в пределах вашего текущего выделения текста, появится всплывающее окно с опциями, которые влияют на выделение текста, выделение текста будет сохраняться, а курсор не будет двигаться.
Проблема в том, что я не могу найти , где Я могу поместить код, который обрабатывает изменение выбора. Я попробовал:
- Использование события «PopupMenuWillBecomeVisible», которое запускается до того, как всплывающее окно становится видимым. Событие, переданное в этот метод, не содержит никакой информации о событиях мыши, поэтому я не могу использовать viewtomodel, чтобы узнать, как изменить выбор. Я мог бы использовать MouseInfo, но в лучшем случае это кажется сомнительным.
- Использование событий MousePressed / MouseReleased в JTextPane или JFrame. По-видимому, ни одно из этих событий не вызывается при запуске всплывающего меню. На самом деле, я все еще не могу определить родительский компонент моего всплывающего меню. (Я читал, что в Windows «MouseReleased» является триггером всплывающих окон, в то время как в других системах «MousePressed» является триггером. Я пробовал оба, и ни один из них не работал).
Итак, я предполагаю, что проблема в том, что я не могу найти место для размещения кода, где он будет вызываться до того, как всплывающее меню станет видимым, но он знает о mouseEvent, которое вызвало всплывающее меню. Должно быть, я что-то здесь упускаю.