如何在Java中的JTextPane中创建一个自动完成弹出窗口?

3

我正在创建一个SQL编辑器。我正在使用JTextPane作为编辑器。我想实现自动完成表名等功能,就像Eclipse一样。


KeyListeners在AWT应用程序中使用。虽然它们仍然可以在Swing中使用,但现在所有的Swing组件都使用Key Bindings,这允许您将一个KeyStroke映射到一个Action。此链接提供了一个简单的解释,以及一个指向Swing教程的链接,以获得完整的解释:http://tips4java.wordpress.com/2008/10/10/key-bindings/ - camickr
5个回答

6
我认为在另一个组件上方显示信息的适当类是JPopupMenu,它已经正确处理层叠以显示自身。JPopupMenu有一个show()方法,它将其“父”组件作为参数,并在该组件的坐标空间中显示自己。由于您想显示用户可以选择的术语选择,因此菜单似乎是合适的。
要检查文本更改,您需要向JTextPane包装的文档添加DocumentListener;您可以使用getDocument()访问它。
要找出光标(实际上是插入符号)的位置,您可以使用getCaretPosition()。它返回作为int的文本流中插入符号的位置。您可以使用modelToView()将该位置转换为实际的(x,y)坐标。这反过来会告诉您要显示菜单的位置。
您可以使用addKeyListener()捕获您的JTextPane上的键盘事件,例如按Ctrl - 空格
所有这些的组合应该允许您做到您想要做的事情。

3

2
针对这种情况,您可能应该考虑使用分层面板,以便您的自动完成建议出现在正确的位置和z-order中。
此外,您需要查找JTextPane中的更改,以知道用户何时正在输入,并且您需要一个理解所键入内容的解析器,以便只在适当的时候提供该功能。
目前不太清楚您的问题是什么以及您已经得到了什么。

2
我通过向JTextPane添加按键监听器并检查CTRL + Space按键组合来实现此功能。当检测到适当的按键组合时,监听器会启动并根据按键时光标左侧的字符查找可能匹配项列表,并找到最佳匹配项并在JPopup中向用户显示它们。如果存在完全匹配,则仅用匹配项替换部分文本。如果未找到匹配项,则向用户提供选项以添加他们已经输入的文本,编辑它并将其记录到可接受数据列表中。

我可以问一下吗 - 当您用匹配项替换JTextPane中的部分文本时,为什么没有出现“IllegalStateException - 尝试在通知期间进行突变”? - Arvanem

2
我们使用jide。他们有很多组件可以帮助您轻松完成此类工作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接