Jtextpane щелкните, чтобы создать эффект всплывающего меню при выборе не так, как предполагалось

У меня есть JTextPane, находящийся в JFrame, с всплывающим меню, которое назначается JTextPane с помощью метода JTextPane.setComponentPopupMenu.

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

Проблема в том, что я не могу найти где разместить код, обрабатывающий изменение выбора. Я пытался:

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

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


person Monolithguy    schedule 27.11.2010    source источник


Ответы (1)


с всплывающим меню, которое назначается JTextPane через метод JTextPane.setComponentPopupMenu.

Вы можете использовать более старый подход к отображению всплывающего окна на основе собственного пользовательского MouseListener.

См. раздел руководства Swing по Вызов всплывающего меню. Теперь у вас есть доступ к MouseEvent, поэтому вы можете преобразовать эту точку в точку в документе, чтобы вы знали, где был сделан щелчок, на выделенном или невыбранном тексте.

person camickr    schedule 27.11.2010