我在我的gui中有一个Jtable,我在其中投射了一些结果!我还有3个JCheckBox用作过滤器!问题是,当我第一次检查JCheckBox时,结果被正确过滤,但是当我取消选中JCheckBox时,结果仍然与应用的过滤器相同,这是我不想要的!
JCheckBox监听器:
cEntertainment.addItemListener(new ItemListener(){
public void itemStateChanged(ItemEvent e){
int state = e.getStateChange();
if (state == ItemEvent.SELECTED) {
man.setEnabled(true);
woman.setEnabled(true);
child.setEnabled(true);
newFilter(cEntertainment.getText());
} else {
man.setEnabled(false);
man.setSelected(false);
woman.setEnabled(false);
woman.setSelected(false);
child.setEnabled(false);
child.setSelected(false);
}
}
});
newFilter方法:
private void newFilter(String type){
RowFilter<DefaultTableModel,Object> rf = null;
try{
rf = RowFilter.regexFilter(type);
}catch(java.util.regex.PatternSyntaxException e){
return;
}
sorter.setRowFilter(rf);
}
答案 0 :(得分:2)
问题似乎是,如果选中此复选框,则永远不会删除添加到行分类器的过滤器。这样,无论复选框状态如何,过滤器都将正常工作。你应该做这样的事情:
cEntertainment.addItemListener(new ItemListener(){
public void itemStateChanged(ItemEvent e){
int state = e.getStateChange();
if (state == ItemEvent.SELECTED) {
...
newFilter(cEntertainment.getText());
} else {
...
removeFilter();
}
}
});
...
private void newFilter(String type) {
RowFilter<DefaultTableModel,Object> rf = null;
try{
rf = RowFilter.regexFilter(type);
}catch(java.util.regex.PatternSyntaxException e){
return;
}
sorter.setRowFilter(rf);
}
private void removeFilter() {
sorter.setRowFilter(null);
}
根据DefaultRowSorter.setRowFilter(RowFilter filter) javadoc(备注是我的):
设置用于确定应隐藏哪些行(如果有)的过滤器 从视角来看。在排序之前应用过滤器。 值
null
表示应包含模型中的所有值。