Jtextpane нажмите, чтобы создать эффект всплывающего меню при выборе не так, как задумано - PullRequest
0 голосов
/ 27 ноября 2010

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

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

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

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

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

1 Ответ

0 голосов
/ 27 ноября 2010

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

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

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

...