Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用bean绑定搜索jTable_Java_Swing_Jtable_Beans Binding - Fatal编程技术网

Java 使用bean绑定搜索jTable

Java 使用bean绑定搜索jTable,java,swing,jtable,beans-binding,Java,Swing,Jtable,Beans Binding,我有一个jTable,它由使用bean绑定的数据库中的数据填充。我想为表实现一个搜索函数。我遇到了以下使用beans绑定实现此目的的教程: 我无法让它工作。当我运行我创建的示例应用程序时,我看到一个意外的值,如“javax.swing.table”。TableRowSorter@16994fe8“出现在搜索文本字段上。这实际上来自converter类中的convertForward()方法,该方法将TableRowSorter对象转换为字符串。在文本字段中键入内容时,不会发生任何情况 我已将j

我有一个jTable,它由使用bean绑定的数据库中的数据填充。我想为表实现一个搜索函数。我遇到了以下使用beans绑定实现此目的的教程:

我无法让它工作。当我运行我创建的示例应用程序时,我看到一个意外的值,如“javax.swing.table”。TableRowSorter@16994fe8“出现在搜索文本字段上。这实际上来自converter类中的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();

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

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

  • 将键入文本字段的文本映射到正则表达式行筛选器
  • 使用beansbinding在键入时筛选表行
因此,转换的方向是从字段(源)到表(目标),您只需要

  • 一个合适的从字符串到行过滤器的转换器,反过来没有多大意义(至少对我来说:-)
  • 从字段的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();
final JXTable table=createTable(调查);
JTextField=新的JTextField(20);
BindingGroup上下文=新建BindingGroup();
自动绑定绑定=绑定。创建自动绑定(读取,
字段,BeanProperty.create(“文本”),
//JXTable,它具有委派功能
//api来设置行过滤器
表,BeanProperty.create(“行过滤器”);
//普通表,使用路径分类器的文件服务器属性
//表,BeanProperty.create(“rowSorter.rowFilter”);
转换器=新转换器(){
@凌驾
公共行筛选器convertForward(字符串值){
if(value==null | | value.trim().length()==0)返回null;
返回RowFilters.regexFilter(值为0);
}
@凌驾
公共字符串反向转换(行筛选器值){
抛出新的UnsupportedOperationException(“此处不期望反向转换”);
}
};
binding.setConverter(转换器);
addBinding(绑定);
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();
BindingGroup context=newbindingGroup();
自动绑定绑定=绑定。创建自动绑定(
UpdateStrategy.READ_WRITE,txtfldSearch,
BeanProperty.create(“文本”),
表供应商,BeanProperty.create(“rowFilter”);
转换器=新转换器(){
@凌驾
公共行筛选器convertForward(字符串值){
if(value==null | | value.trim().length()==0)
返回null;
返回RowFilters.regexFilter(“(?i)。*”+value+“*”);
}
@凌驾
公共字符串反向转换(行筛选器值){
抛出新的UnsupportedOperationException(
“这里不要期望反向转换”);
}
};
binding.setConverter(转换器);
addBinding(绑定);
context.bind();

IMO,在表的行排序器上重置是一个相当疯狂的想法(正如在日志中所做的那样)-您最好绑定到行排序器的筛选器属性(尽管从未尝试过)。可能是AutoCurrAudioWoSter与转换器中的手动设置冲突(野生猜测:-----),为了进一步的帮助,您可能会考虑显示SSCCE,这样我们就可以很容易地重现问题。