我有一个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();
非常感谢这方面的任何帮助。
答案 0 :(得分:2)
碰巧我最近需要类似的东西,结果却很简单:假设你想要
所以转换的方向是从字段(源)到表(目标),你需要的只是
类似的东西:
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();
答案 1 :(得分:0)
此代码将从整个表中搜索,并且不区分大小写。并感谢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();