我正在创建一个 SQL 编辑器。我正在使用 JTextPane 作为编辑器。我想为表名等实现自动完成,比如 Eclipse。
5 回答
我认为在另一个组件之上显示信息的适当类是JPopupMenu
,它已经正确处理分层以显示自身。JPopupMenu 有一个show()
将其“父”组件作为参数的方法,它将在该组件的坐标空间中显示自己。由于您希望显示一组术语供用户选择,因此菜单似乎很合适。
要检查文本更改,您需要将 ; 添加到由;DocumentListener
包裹的文档中。JTextPane
您可以使用getDocument()
.
要找出光标(实际上是插入符号)的位置,您可以使用getCaretPosition()
. 这会将插入符号在文本流中的位置作为int
. 您可以使用modelToView()
将该位置转换为实际的 (x,y) 坐标。这反过来会告诉你在哪里显示你的菜单。
你可以addKeyListener()
用来捕捉你的键盘事件JTextPane
,比如点击Ctrl- Space。
所有这些的结合应该可以让你做你想做的事情。
您也可以使用http://fifesoft.com/autocomplete/。您可以将它安装在任何 JTextComponent 上。
我通过向 JTextPane 添加键侦听器并检查 CTRL + Space 击键来实现这一点。当检测到适当的组合键时,侦听器关闭并根据按键时光标左侧的字符查找可能匹配的列表,并找到最佳匹配并将它们显示给用户弹出窗口。如果有完全匹配,那么它只是用匹配替换部分文本。如果未找到匹配项,则会向用户提供一个选项,以添加他们已经键入的文本,对其进行编辑并将其记录到可接受的数据列表中。
对于这样的事情,您可能应该考虑分层窗格,以便您的自动完成建议出现在正确的位置和 z 顺序中。
此外,您将必须查找更改JTextPane
以了解用户何时键入,并且您将需要一个解析器来了解键入的内容,以便您只能在适当的位置提供该功能。
目前还不太清楚你的问题到底是什么以及到目前为止你得到了什么。
我们使用jide。他们有很多组件可以帮助您非常轻松地完成此类事情