Я создаю редактор SQL. Я использую JTextPane для редактора. Я хочу реализовать автозаполнение для имени таблицы и т. д., например Eclipse.
Как я могу создать всплывающее окно автозаполнения в JTextPane в Java?
Ответы (5)
Я думаю, что подходящий класс для отображения информации поверх другого компонента — это JPopupMenu
, который уже правильно обрабатывает слои для отображения самого себя. JPopupMenu имеет метод show()
, который принимает свой «родительский» компонент в качестве аргумента и показывает себя в координатном пространстве этого компонента. Поскольку вы хотите отобразить набор терминов, из которых пользователь может выбирать, меню кажется подходящим.
Чтобы проверить текстовые изменения, вы должны добавить DocumentListener
к документу, заключенному в JTextPane
; вы можете получить к нему доступ, используя getDocument()
.
Чтобы узнать, где находится курсор (на самом деле, знак вставки), вы можете использовать getCaretPosition()
. Это возвращает позицию курсора в текстовом потоке как int
. Вы можете использовать modelToView()
для перевода этой позиции в фактические (x, y) координаты. Это, в свою очередь, скажет вам, где показать ваше меню.
Вы можете использовать addKeyListener()
для перехвата событий клавиатуры на JTextPane
, например, нажатия Ctrl-Пробел.
Сочетание всего, что должно позволить вам делать то, что вы хотите сделать.
Вы также можете использовать http://fifesoft.com/autocomplete/. Вы можете установить его на любой JTextComponent.
Для таких вещей вам, вероятно, следует рассмотреть многослойные панели чтобы ваши предложения автозаполнения отображались в правильном месте и в правильном z-порядке.
Кроме того, вам придется искать изменения в JTextPane
, чтобы знать, когда пользователь печатает, и вам понадобится синтаксический анализатор, который понимает, что печатается, чтобы вы могли предлагать эту функцию только в соответствующих точках.
Не совсем понятно, в чем именно ваша проблема и что вы получили до сих пор.
Я добился этого, добавив прослушиватель клавиш в JTextPane и проверив нажатия клавиш CTRL + Space. Когда соответствующая комбинация клавиш была обнаружена, прослушиватель отключался и просматривал список возможных совпадений на основе символов непосредственно слева от курсора во время нажатия клавиши, находил лучшие совпадения и отображал их пользователю в виде JPopup. Если было точное совпадение, то он просто заменял частичный текст совпадением. Если совпадений не было найдено, пользователю была предоставлена возможность добавить текст, который он уже набрал, отредактировать его и записать в список допустимых данных.
Мы используем jide. У них есть много компонентов, которые помогают вам делать такие вещи очень легко.