Java Jtextpane单击以在选择时创建弹出菜单效果不符合预期

Java Jtextpane单击以在选择时创建弹出菜单效果不符合预期,java,caret,jtextpane,popupmenu,Java,Caret,Jtextpane,Popupmenu,我有一个JTextPane,它位于JFrame中,有一个弹出菜单,通过JTextPane.setComponentPopupMenu方法分配给JTextPane 我想给JTextPane一个“类似单词”的弹出行为。我的意思是,如果在当前文本选择之外单击鼠标右键,插入符号将重新定位到右键单击的位置,并禁用影响文本选择的菜单选项(例如剪切、复制或粗体)。如果在当前文本选择中单击鼠标右键,弹出窗口将显示启用了影响文本选择的选项,文本选择将保持不变,插入符号不会移动 问题是我似乎找不到我可以将处理选择更

我有一个JTextPane,它位于JFrame中,有一个弹出菜单,通过JTextPane.setComponentPopupMenu方法分配给JTextPane

我想给JTextPane一个“类似单词”的弹出行为。我的意思是,如果在当前文本选择之外单击鼠标右键,插入符号将重新定位到右键单击的位置,并禁用影响文本选择的菜单选项(例如剪切、复制或粗体)。如果在当前文本选择中单击鼠标右键,弹出窗口将显示启用了影响文本选择的选项,文本选择将保持不变,插入符号不会移动

问题是我似乎找不到我可以将处理选择更改的代码放在哪里。我试过:

  • 使用“PopupMenuWillBecomeVisible”事件,该事件在弹出窗口变为可见之前触发。传递到此方法的事件不包含任何鼠标事件信息,因此我无法使用viewtomodel了解如何修改选择。我可以用MouseInfo,但这充其量也令人怀疑
  • 在JTextPane或JFrame中使用MousePressed/MouseReleased事件。显然,当弹出菜单被触发时,这两个事件都不会被调用。事实上,我仍然无法确定弹出菜单的父组件是什么。(我确实读到,在windows中,“MouseRelease”是弹出式触发器,而在其他系统中,“MousePressed”是触发器。我尝试了这两种方法,但都不起作用)
所以,我想问题是,我似乎找不到一个地方来放置代码,在弹出菜单可见之前调用代码,但我知道触发弹出菜单的mouseEvent。我一定是遗漏了什么

使用通过JTextPane.setComponentPopupMenu方法分配给JTextPane的弹出菜单

您可以使用旧的方法根据自己的自定义鼠标侦听器显示弹出窗口

请参见上的Swing教程中的部分。现在,您可以访问MouseEvent,以便将该点转换为文档中的一个点,从而知道在选定或未选定文本上单击的位置