2015-05-25 53 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