Как я могу создать всплывающее окно автозаполнения в JTextPane в Java?

Я создаю редактор SQL. Я использую JTextPane для редактора. Я хочу реализовать автозаполнение для имени таблицы и т. д., например Eclipse.


person Green    schedule 16.12.2009    source источник
comment
KeyListeners используются в приложениях AWT. Хотя они по-прежнему будут работать в Swing, все компоненты Swing теперь используют привязки клавиш, которые позволяют сопоставлять нажатие клавиш с действием. Эта ссылка содержит простое объяснение, а также ссылку на учебник Swing для полного объяснения: tips4java.wordpress.com/2008/10/10/key-bindings   -  person camickr    schedule 16.12.2009


Ответы (5)


Я думаю, что подходящий класс для отображения информации поверх другого компонента — это JPopupMenu, который уже правильно обрабатывает слои для отображения самого себя. JPopupMenu имеет метод show(), который принимает свой «родительский» компонент в качестве аргумента и показывает себя в координатном пространстве этого компонента. Поскольку вы хотите отобразить набор терминов, из которых пользователь может выбирать, меню кажется подходящим.

Чтобы проверить текстовые изменения, вы должны добавить DocumentListener к документу, заключенному в JTextPane; вы можете получить к нему доступ, используя getDocument().

Чтобы узнать, где находится курсор (на самом деле, знак вставки), вы можете использовать getCaretPosition(). Это возвращает позицию курсора в текстовом потоке как int. Вы можете использовать modelToView() для перевода этой позиции в фактические (x, y) координаты. Это, в свою очередь, скажет вам, где показать ваше меню.

Вы можете использовать addKeyListener() для перехвата событий клавиатуры на JTextPane, например, нажатия Ctrl-Пробел.

Сочетание всего, что должно позволить вам делать то, что вы хотите сделать.

person Carl Smotricz    schedule 16.12.2009

Вы также можете использовать http://fifesoft.com/autocomplete/. Вы можете установить его на любой JTextComponent.

person MarkL    schedule 21.09.2010

Для таких вещей вам, вероятно, следует рассмотреть многослойные панели чтобы ваши предложения автозаполнения отображались в правильном месте и в правильном z-порядке.

Кроме того, вам придется искать изменения в JTextPane, чтобы знать, когда пользователь печатает, и вам понадобится синтаксический анализатор, который понимает, что печатается, чтобы вы могли предлагать эту функцию только в соответствующих точках.

Не совсем понятно, в чем именно ваша проблема и что вы получили до сих пор.

person Joey    schedule 16.12.2009

Я добился этого, добавив прослушиватель клавиш в JTextPane и проверив нажатия клавиш CTRL + Space. Когда соответствующая комбинация клавиш была обнаружена, прослушиватель отключался и просматривал список возможных совпадений на основе символов непосредственно слева от курсора во время нажатия клавиши, находил лучшие совпадения и отображал их пользователю в виде JPopup. Если было точное совпадение, то он просто заменял частичный текст совпадением. Если совпадений не было найдено, пользователю была предоставлена ​​возможность добавить текст, который он уже набрал, отредактировать его и записать в список допустимых данных.

person Antz    schedule 16.12.2009
comment
Могу я просто спросить - как получилось, что вы не получили IllegalStateException - попытку мутировать во время уведомления, когда вы заменили частичный текст в JTextPane совпадением? - person Arvanem; 30.08.2010

Мы используем jide. У них есть много компонентов, которые помогают вам делать такие вещи очень легко.

person dave    schedule 05.12.2012