使用bean绑定搜索jTable

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用bean绑定搜索jTable相关的知识,希望对你有一定的参考价值。

我有一个jTable,它由使用Beans Binding的数据库中的数据填充。我想为表实现一个搜索功能。我遇到了以下教程,使用bean绑定实现了这一点:

https://weblogs.java.net/blog/pkeegan/archive/2008/06/using_beans_bin.html

我无法让它工作。当我运行我创建的示例应用程序时,我看到一个意外的值,例如“javax.swing.table.TableRowSorter@16994fe8”出现在搜索文本字段中。这实际上来自转换器类中的convertForward()方法,它将TableRowSorter对象转换为字符串。当我在文本字段上输入内容时没有任何反应。

我已将我的jTable的autoCreateRowSorter属性设置为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();

非常感谢在这方面的任何帮助。

答案

碰巧我最近需要类似的东西,结果却很简单:假设你想要

  • 将键入文本字段的文本映射到正则表达式rowFilter
  • 使用beansbinding在键入时过滤表行

所以转换的方向是从字段(源)到表(目标),你需要的只是

  • 从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();
另一答案

此代码将从整个表中搜索,它不区分大小写。并感谢kleopatra你的答案是非常有帮助的

    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();

以上是关于使用bean绑定搜索jTable的主要内容,如果未能解决你的问题,请参考以下文章

如何使用绑定类通过代码将 JComboBox selectedItem 绑定到 Jtable?

使用特定列对 Jtable 项目进行排序 - JAVA

如何刷新与 jtable 绑定的 Jscrollpane 中的数据?

关于使按钮在 Netbeans 的 GUI 编辑器中工作的 JDBC 到 JTable 输出查询

如何使用 netbeans 轻松地将任何数据库视图绑定到 jtable?

使用textfield在JTable上使用Autocomplete搜索Mysql数据库