【问题标题】:How can I create an AutoComplete popup in a JTextPane in Java?如何在 Java 的 JTextPane 中创建自动完成弹出窗口?
【发布时间】:2012-12-05 23:31:34
【问题描述】:

我正在创建一个 SQL 编辑器。我正在使用 JTextPane 作为编辑器。我想像 Eclipse 一样为表名等实现 AutoCompletion。

【问题讨论】:

  • KeyListeners 在 AWT 应用程序中使用。尽管它们仍然可以在 Swing 中工作,但所有 Swing 组件现在都使用键绑定,它允许您将 KeyStroke 映射到 Action。此链接提供了一个简单的解释以及指向 Swing 教程的链接以获得完整的解释:tips4java.wordpress.com/2008/10/10/key-bindings

标签: java autocomplete jtextpane


【解决方案1】:

我认为在另一个组件上显示信息的适当类是JPopupMenu,它已经正确处理分层以显示自身。 JPopupMenu 有一个show() 方法,它将其“父”组件作为参数,它将在该组件的坐标空间中显示自己。由于您希望显示一系列术语供用户选择,因此菜单似乎很合适。

要检查文本更改,您需要将DocumentListener 添加到由JTextPane 包裹的文档中;您可以使用getDocument() 访问它。

要找出光标(实际上是插入符号)的位置,您可以使用getCaretPosition()。这会将插入符号在文本流中的位置作为int 返回。您可以使用 modelToView() 将该位置转换为实际 (x,y) 坐标。这反过来会告诉你在哪里显示你的菜单。

您可以使用addKeyListener() 捕捉JTextPane 上的键盘事件,例如按Ctrl-Space

所有这些的组合应该可以让你做你想做的事。

【讨论】:

    【解决方案2】:

    您也可以使用http://fifesoft.com/autocomplete/。您可以将它安装在任何 JTextComponent 上。

    【讨论】:

      【解决方案3】:

      对于这样的事情,您可能应该考虑layered panes,以便您的自动完成建议出现在正确的位置和 z 顺序中。

      此外,您必须在 JTextPane 中查找更改以了解用户何时输入,并且您需要一个能够理解输入内容的解析器,以便您仅在适当的位置提供该功能。

      目前还不太清楚你的问题到底是什么以及到目前为止你得到了什么。

      【讨论】:

        【解决方案4】:

        我通过向 JTextPane 添加一个按键侦听器并检查 CTRL + Space 击键来实现这一点。当检测到适当的组合键时,侦听器关闭并根据按键时光标左侧的字符查找可能的匹配列表,并找到最佳匹配并将它们显示给用户弹出窗口。如果有完全匹配,那么它只是用匹配替换部分文本。如果未找到匹配项,则会向用户提供一个选项,以添加他们已经输入的文本,对其进行编辑并将其记录到可接受的数据列表中。

        【讨论】:

        • 我可以问一下 - 当您将 JTextPane 中的部分文本替换为匹配项时,您为什么没有收到“IllegalStateException - 在通知期间尝试变异”?
        【解决方案5】:

        我们使用jide。他们有很多组件可以帮助您真正轻松地完成这种事情

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-12-03
          • 2022-01-19
          • 2013-07-14
          • 2011-07-07
          • 2018-06-01
          • 2016-01-07
          • 2017-08-01
          • 2022-12-03
          相关资源
          最近更新 更多