Поиск 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();
Другие вопросы по тегам