качели, показать JList поверх редактируемой jTable, чтобы выбрать записи для автозаполнения текста - PullRequest
3 голосов
/ 10 ноября 2009

У меня есть JTable с редактируемыми ячейками. Каждая ячейка содержит CarretListener для быстрой проверки введенного текста. Но в одной специальной ячейке вы сможете выбрать записи из списка. Список генерируется при вводе текста. Программа поиска в списке для записей, равных, поэтому введенный текст, как Google предлагает. Пока все хорошо. Но я не понимаю, как показать список в правильном положении. Я попробовал GlassPane, но это не так хорошо работает. У меня есть проблемы, чтобы получить координаты ячейки и показать JList. Установите высоту строки, чтобы показать, что весь список также не работает, потому что я не хочу менять всю строку. Может быть, есть хитрость в TableCellRenderer или так ...? Мне не нужен полный исходный код или около того, но мне нужен толчок в правильном направлении.

Вот картинка программы, и она должна выглядеть следующим образом: http://img198.imageshack.us/img198/3227/sosollsseinh.jpg Спасибо за ваше внимание

Марк

Ответы [ 2 ]

1 голос
/ 10 ноября 2009

Если вы не примените определенное поведение к своему списку, вы можете попробовать другой способ, добавив комбинированный список в качестве редактора этой таблицы. Проверьте DefaultCellEditor для примера этого.

Если вы измените содержимое поля со списком при его вызове с правильными значениями, я думаю, оно будет соответствовать вашим потребностям. Для этого вам нужно будет создать свой собственный CellEditor, скорее всего, с помощью TableCellEditor , чтобы вы могли изменять его значения в зависимости от того, когда он вызывается (в методе getTableCellEditorComponent ()) .


Редактировать: О проблеме KeyListener , о которой вы говорите в комментарии, вы должны думать, что событие Key отправляется до обновления фактического текста в JTextField. Поэтому нормально, что ваш вызов getText() возвращает значение без нового символа.

Однако, поскольку это KeyEvent , у вас есть доступ к набранному символу, непосредственно с evt.getKeyChar() или evt.getKeyCode(), чтобы проверить, действительно ли это была напечатанная буква. С помощью этих методов вы можете узнать полный «текст», который вам нужен.


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

Если вы можете (и можете) использовать дополнительные библиотеки, я бы порекомендовал вам взглянуть на компоненты SwingX (http://swinglabs.org/).). Эта библиотека в целом предлагает множество полезных компонентов для использовать в Swing-интерфейсах. На их сайте есть демонстрационная версия, хотя, кажется, она недоступна в этот час, может быть, позже.

В их пакете " autocomplete " вы сможете найти класс с именем "AutoCompleteDecorator" и другие полезные, которые позволят вам улучшить ваш редактор Combobox, чтобы он пытался завершите сам пользовательский ввод и выделите правильную позицию в списке (я думаю, что он также может фильтровать список, точное поведение, которое вы хотите, но я не совсем уверен). Если вы сможете использовать это, это фактически избавит вас от необходимости самим заботиться о каретных событиях, а также обновит список, как это, скорее всего, сделает для вас.

Вы можете скачать .Jar и javadoc на их сайте. Вот копия javadoc с другого сайта для пакета автозаполнения, хотя он мог бы измениться за это время, но он даст вам представление.

0 голосов
/ 10 ноября 2009

Разве вы не можете просто JCombobox вместо JList? Это было бы проще, нет. Поскольку DefaultCellEditor поддерживает JCombobox из коробки,

TableColumn X = table.getColumnModel().getColumn(Y);
JComboBox cb = new JComboBox(VECTOR_OF_ITEMS);
X.setCellEditor(new DefaultCellEditor(cb));
...