Поиск jTable с использованием привязки bean-компонентов
У меня есть jTable, который заполняется данными из базы данных с использованием Beans Binding. Я хочу реализовать функцию поиска для таблицы. Я наткнулся на следующий урок, который достигает этого с помощью привязки bean-компонентов:
https://weblogs.java.net/blog/pkeegan/archive/2008/06/using_beans_bin.html
Я не могу заставить его работать. Когда я запускаю пример приложения, которое я создал, я вижу неожиданное значение, такое как "javax.swing.table.TableRowSorter@16994fe8", появляющееся в текстовом поле поиска. На самом деле это происходит из метода convertForward() в классе конвертера, который преобразует объект TableRowSorter в строку. Ничего не происходит, когда я набираю что-то в текстовом поле.
Я установил для свойства autoCreateRowSorter моего jTable значение true. Я не использую пользовательскую модель таблицы, поскольку таблица заполняется с использованием привязки bean-компонентов с использованием модели таблицы по умолчанию.
Отмечено, что методы getTable(), setTable() или convertReverse() класса конвертера не вызываются. Мне интересно, пропустил ли я что-нибудь в процессе.
Ниже приведен код, который я использую, чтобы связать текстовое поле поиска с jTable:
BindingGroup bindingGroup = new BindingGroup();
RowSorterToStringConverter bindingConverter = new RowSorterToStringConverter();
Binding searchBinding = Bindings.createAutoBinding(
UpdateStrategy.READ_WRITE,
employeeTable,
ELProperty.create("${rowSorter}"),
txtSearch,
BeanProperty.create("text"));
searchBinding.setConverter(bindingConverter);
bindingGroup.addBinding(searchBinding);
bindingGroup.bind();
Любая помощь в этом отношении с благодарностью.
2 ответа
Просто так получилось, что недавно мне понадобилось что-то похожее, и оказалось, что это довольно просто: если вы хотите
- сопоставить текст, введенный в текстовое поле, с регулярным выражением rowFilter
- использовать привязку фасоли для фильтрации строк таблицы при наборе текста
Таким образом, направление преобразования от поля (источник) к таблице (цель), и все, что вам нужно, это
- подходящий конвертер из String в Rowfilter, обратное не имеет особого смысла (по крайней мере, для меня:-)
- привязка из свойства text поля к свойству rowFilter таблицы (при условии JXTable, для простой таблицы вам понадобится путь вниз к фильтру сортировщика)
- прикрепить конвертер к обвязке
Что-то вроде:
final JXTable table = createTable(surveys);
JTextField field = new JTextField(20);
BindingGroup context = new BindingGroup();
AutoBinding binding = Bindings.createAutoBinding(READ,
field, BeanProperty.create("text"),
// JXTable which has delegating
// api to set the rowFilter
table, BeanProperty.create("rowFilter"));
// plain table, use path the sorter's filer property
//table, BeanProperty.create("rowSorter.rowFilter"));
Converter<String, RowFilter> converter = new Converter<String, RowFilter>() {
@Override
public RowFilter convertForward(String value) {
if (value == null || value.trim().length() == 0) return null;
return RowFilters.regexFilter(value, 0);
}
@Override
public String convertReverse(RowFilter value) {
throw new UnsupportedOperationException("don't expect reverse conversion here");
}
};
binding.setConverter(converter);
context.addBinding(binding);
context.bind();
Этот код будет искать по всей таблице, и он чувствителен к регистру. а благодаря клеопатре твой ответ очень поможет полный
BindingGroup context = new BindingGroup();
AutoBinding binding = Bindings.createAutoBinding(
UpdateStrategy.READ_WRITE, txtfldSearch,
BeanProperty.create("text"),
tableSupplier, BeanProperty.create("rowFilter"));
Converter<String, RowFilter> converter = new Converter<String, RowFilter>() {
@Override
public RowFilter convertForward(String value) {
if (value == null || value.trim().length() == 0)
return null;
return RowFilters.regexFilter("(?i).*" + value + ".*");
}
@Override
public String convertReverse(RowFilter value) {
throw new UnsupportedOperationException(
"don't expect reverse conversion here");
}
};
binding.setConverter(converter);
context.addBinding(binding);
context.bind();