删除过滤后Jtable错误结果

时间:2014-02-06 16:21:10

标签: java swing jtable jcheckbox

我在我的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);
}

1 个答案:

答案 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   表示应包含模型中的所有值。