2015-05-25 51 views
1

我使用defaulttablemodel创建了带有combobox的表格。我需要根据组合框值(10,20,30,40)隐藏/显示已经创建和填充的行。在jtable中隐藏/显示行

private void newFilter(int numberOfRows) { 
    RowFilter<TableModel, Integer> filter = new RowFilter<TableModel, Integer>() { 
     @Override 
     public boolean include(RowFilter.Entry<? extends TableModel, ? extends Integer> entry) { 
      int i = table.convertRowIndexToView(entry.getIdentifier()); 

      return i < numberOfRows; 

     } 

    }; 

    ((TableRowSorter) table.getRowSorter()).setRowFilter(filter); 
} 


combobox.addItemListener(new ItemListener() { 

     @Override 
     public void itemStateChanged(ItemEvent e) { 

      String s = (String) combobox.getSelectedItem(); 

      if (s.equals("10")) { 
       newFilter(10); 
      } else if (s.equals("15")) { 
       newFilter(15); 
      } else if (s.equals("20")) { 
       newFilter(20); 
      } else if (s.equals("30")) { 
       newFilter(30); 
      } else if (s.equals("40")) { 
       newFilter(40); 

      } 

     } 
    }); 

我试过这样,它的工作原理,直到我再次选择相同的价值,例如10,那么它什么都不做。我该怎么办?

+0

今后,发布正确的[SSCCE(http://sscce.org/)演示该问题。请参阅我的答案,了解一个SSCCE的例子。 – camickr

回答

2
int i = table.convertRowIndexToView(entry.getIdentifier()); 

当行被过滤时,上述语句返回-1。因此,一旦一行被过滤,它仍然被过滤。

然后我试着使用:

((TableRowSorter) table.getRowSorter()).setRowFilter(null); 
((TableRowSorter) table.getRowSorter()).setRowFilter(filter); 

,企图重新设置过滤器,但似乎并没有像现在0正在为“我”的值返回工作岗位。

所以最后我想:

private void newFilter(int numberOfRows) 
{ 
    final RowFilter<TableModel, Integer> filter = new RowFilter<TableModel, Integer>() 
    { 
     @Override 
     public boolean include(RowFilter.Entry<? extends TableModel, ? extends Integer> entry) 
     { 
      int i = table.convertRowIndexToView(entry.getIdentifier()); 

      //System.out.println(i + " : " + numberOfRows + " : " + entry.getIdentifier()); 

      return i < numberOfRows; 
     } 

    }; 

    ((TableRowSorter) table.getRowSorter()).setRowFilter(null); 

    SwingUtilities.invokeLater(new Runnable() 
    { 
     public void run() 
     { 
      ((TableRowSorter) table.getRowSorter()).setRowFilter(filter); 
     } 
    }); 

} 

,它似乎工作。

希望有人有更好的解决方案。

下面是完整的代码,我用我的测试:

import java.awt.*; 
import java.awt.event.*; 
import java.awt.image.*; 
import java.util.*; 
//import java.util.List; 
import javax.swing.*; 
import javax.swing.event.*; 
//import javax.swing.text.*; 
//import java.beans.*; 
import javax.swing.border.*; 
//import javax.swing.plaf.*; 
//import javax.swing.text.*; 
import javax.swing.table.*; 
//import java.io.*; 
//import javax.imageio.*; 
//import java.awt.geom.*; 

public class SSCCE extends JPanel 
{ 
    private JTable table; 

    public SSCCE() 
    { 
     setLayout(new BorderLayout()); 

     JComboBox<Integer> comboBox = new JComboBox<Integer>(); 
     comboBox.addItem(new Integer(10)); 
     comboBox.addItem(new Integer(20)); 
     comboBox.addItem(new Integer(30)); 
     comboBox.addItem(new Integer(40)); 

     comboBox.addItemListener(new ItemListener() 
     { 
      @Override 
      public void itemStateChanged(ItemEvent e) 
      { 
       Integer value = (Integer)comboBox.getSelectedItem(); 
       newFilter(value); 
      } 
     }); 
     add(comboBox, BorderLayout.NORTH); 

     table = new JTable(40, 3); 
     table.setAutoCreateRowSorter(true); 
     JScrollPane scrollPane = new JScrollPane(table); 
     add(scrollPane, BorderLayout.CENTER); 
    } 

    private void newFilter(int numberOfRows) 
    { 
     final RowFilter<TableModel, Integer> filter = new RowFilter<TableModel, Integer>() 
     { 
      @Override 
      public boolean include(RowFilter.Entry<? extends TableModel, ? extends Integer> entry) 
      { 
       int i = table.convertRowIndexToView(entry.getIdentifier()); 

       //System.out.println(i + " : " + numberOfRows + " : " + entry.getIdentifier()); 

       return i < numberOfRows; 
      } 

     }; 

     ((TableRowSorter) table.getRowSorter()).setRowFilter(null); 

     SwingUtilities.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       ((TableRowSorter) table.getRowSorter()).setRowFilter(filter); 
      } 
     }); 

    } 

    private static void createAndShowGUI() 
    { 
     JPanel panel = new JPanel(); 

     JFrame frame = new JFrame("SSCCE"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(new SSCCE()); 
     frame.setLocationByPlatform(true); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) 
    { 
     EventQueue.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       createAndShowGUI(); 
      } 
     }); 
    } 
} 
+0

它的工作原理。非常感谢。 –

+0

加1,但似乎更好和/或过滤器 – mKorbel