Search code examples
javaswingjtablerowfilter

Java Swing: Combine RowFilter.andFilter with RowFilter.orFilter


I couldn't quite get this to work, and the examples I found only worked with a single RowFilter.andFilter or a RowFilter.orFilter. Is there a way to combine two to get something like (A || B) && (C || D)? Below is some sample code of what I'm attempting.

ArrayList<RowFilter<Object,Object>> arrLstColorFilters = new ArrayList<RowFilter<Object,Object>>();
ArrayList<RowFilter<Object,Object>> arrLstCandyFilters = new ArrayList<RowFilter<Object,Object>>();
RowFilter<Object,Object> colorFilter;
RowFilter<Object,Object> candyFilter;
TableRowSorter<TableModel> sorter;

// OR colors
RowFilter<Object,Object> blueFilter = RowFilter.regexFilter("Blue", myTable.getColumnModel().getColumnIndex("Color"));
RowFilter<Object,Object> redFilter = RowFilter.regexFilter("Red", myTable.getColumnModel().getColumnIndex("Color"));
arrLstColorFilters.add(redFilter);
arrLstColorFilters.add(blueFilter);
colorFilter = RowFilter.orFilter(arrLstColorFilters);

// OR candies
RowFilter<Object,Object> mAndMFilter = RowFilter.regexFilter("M&M", myTable.getColumnModel().getColumnIndex("Candy"));
RowFilter<Object,Object> mentosFilter = RowFilter.regexFilter("Mentos", myTable.getColumnModel().getColumnIndex("Candy"));
arrLstCandyFilters.add(mAndMFilter);
arrLstCandyFilters.add(mentosFilter);
candyFilter = RowFilter.orFilter(arrLstCandyFilters);

// Mentos and M&Ms that are red or blue (this is where I'm stuck)
sorter.setRowFilter(RowFilter.andFilter(candyFilter, colorFilter);  //this does not work

If someone could provide a working snippet for what I'm trying to do in the last line, it'd be much appreciated. Currently maintaining two separate table models to circumvent this problem, and I'd like to avoid duplicating data.

Thanks, Kai


Solution

  • Your last line doesn't even compile, because andFilter also requires a list instead of separate arguments.

    Otherwise your example seem to work find in my tests. I replaced the last line in your example with the following code:

    ArrayList<RowFilter<Object, Object>> andFilters = new ArrayList<RowFilter<Object, Object>>();
    andFilters.add(candyFilter);
    andFilters.add(colorFilter);
    
    sorter = new TableRowSorter<TableModel>(myTable.getModel());
    
    // Mentos and M&Ms that are red or blue
    sorter.setRowFilter(RowFilter.andFilter(andFilters));
    
    myTable.setRowSorter(sorter);
    

    Please make sure that you initialize the TableRowSorter with the appropriate table model.