Как я могу создать всплывающее окно автозаполнения в JTextPane в Java? - PullRequest
3 голосов
/ 16 декабря 2009

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

Ответы [ 5 ]

6 голосов
/ 16 декабря 2009

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

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

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

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

Комбинация всего, что должно позволить вам делать то, что вы ищете.

3 голосов
/ 21 сентября 2010

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

2 голосов
/ 05 декабря 2012

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

2 голосов
/ 16 декабря 2009

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

2 голосов
/ 16 декабря 2009

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

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

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

...