【问题标题】:Search jTable using beans binding使用 bean 绑定搜索 jTable
【发布时间】:2013-12-04 01:45:26
【问题描述】:

我有一个 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();

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

【问题讨论】:

  • IMO,重置表格的 rowSorter 是一个相当疯狂的想法(如博客中所做的那样) - 你最好绑定到 rowSorter 的 filter 属性(但从未尝试过)。可能是 autocreateRowSorter 与转换器中的手动设置发生冲突(疯狂猜测 :-) 无论如何,为了进一步的帮助,您可以考虑显示 SSCCE,以便我们可以轻松地重现问题。

标签: java swing jtable beans-binding


【解决方案1】:

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

  • 将输入到文本字段中的文本映射到正则表达式行过滤器
  • 使用 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();

【讨论】:

    【解决方案2】:

    此代码将从整个表中搜索,并且不区分大小写。感谢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();
    

    【讨论】:

      猜你喜欢
      • 2021-03-04
      • 2020-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多