如何获取JTextArea中单词(或选择)在屏幕上的位置值?

时间:2017-09-01 17:46:10

标签: java swing jtextarea mouselistener

我的目标是在JTextArea"可操作的"中制作anyGivenWord。例如,当您将鼠标悬停在anyGivenWord上时,会出现工具提示,但不会将鼠标悬停在JTextArea中的任何其他单词上。因为你不能直接根据我的知识这样做,所以我考虑将一个组件放在JTextArea中每个anyGivenWord出现的位置,并在JTextArea的大小发生变化时让它重新定位,以便点击看似anyGivenWord实际上是点击组件(导致一些监听器被触发)。为此,我需要知道该单词出现在哪个点(x,y),因此我可以将该组件置于该点。

我以为我可以搜索JTextArea并选择anyGivenWord的实例,然后选择getSelectionStart()和getSelectionEnd(),但我认为这些方法返回的int是所选第一个/最后一个字母的索引,如,它在getText()返回的字符串中的位置。我需要的是x / y坐标。这可能吗?

如果没有......有任何建议可以采用更优雅的方式来做我想做的事情吗?

2 个答案:

答案 0 :(得分:0)

您可以将JEditorPane与HTML结合使用,并为任何给定的单词添加超链接。阅读How to Use Editor Panes上Swing教程中的部分,了解基础知识,以便开始使用。

然后,您可以添加HyperlinkListener以在单击单词时响应事件。请阅读JEditorPane API,了解使用HyperlinkListener

的示例
  

例如,当您将鼠标悬停在anyGivenWord上时,会出现工具提示,

如果您不想使用超链接,则可以通过覆盖getToolTipText(...)方法来控制工具提示文本。此方法接收MouseEvent,以便您可以获取鼠标位置。然后,您可以使用JTextArea的viewToModel(...)方法获取鼠标到Document的偏移量。然后查看Utilities。这个类可以帮助你获得单词的开始/结束偏移,这样你就可以使用getText(...)方法在当前鼠标位置提取单词。

答案 1 :(得分:0)

您可以使用任何JTextComponent并使用一些方法(如下所示),您可以从文本中收集几个不同的项目,如:

  • 位于当前鼠标指针位置下的字符;
  • 位于当前鼠标指针位置下的Word;
  • 位于当前鼠标指针位置下的所选文本 (如果选择);
  • 位于当前鼠标指针位置下方的突出显示的文本 (如果你在文本中突出显示);
  • 鼠标指针下的文字是否已选中?;
  • 鼠标指针下的文字是否突出显示?。

正如@camickr已经如此慷慨地指出,这里的关键是使用 JTextComponent.viewToModel()方法(我相信所有Swing Text组件都包含此方法)以获取与当前鼠标指针在组件中的位置相关的文本索引位置。

以下是一些可以使用的方法:

def filename
  File.basename(path)
end