2014-09-25 109 views
1

我有JFrame一个JTableJComboBox有选择如何针对特定列过滤JTable?

  • “别代码”
  • “离开描述”

我需要相对于过滤表中的数据离开代码休假代码时在组合框中被选中并且当在组合框中选择离开描述时针对leavedesc进行过滤。

这是我用来过滤数据的功能:

private void filtervalue(String filterString) { 
    TableModel model = tableLeave.getModel(); 
    final TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(model); 
    tableLeave.setRowSorter(sorter); 
    if (filterString.length() == 0) { 
     sorter.setRowFilter(null); 
    } else { 
     sorter.setRowFilter(RowFilter.regexFilter("(?i)" + filterString)); 
    } 
} 

但问题是它会通过leavedesc排序以及leavecode,所以在组合框中没有影响。请帮我实施基于列的过滤器。

+2

考虑提供一个[runnable示例](https://stackoverflow.com/help/mcve),它演示你的问题。这将导致更少的混淆和更好的反应 – MadProgrammer 2014-09-25 05:45:19

+0

您的过滤器将过滤所有列,您应该提供您要过滤的列索引(s)... – MadProgrammer 2014-09-25 05:46:51

+0

感谢您的回复 – 2014-09-25 06:14:58

回答

3

没有一个可运行的例子,我不能100%确定,但我猜想每次更改过滤器文本时设置RowSorter都会导致表重新排序。

相反,设置TableRowSorter在创建JTable,并简单地更新过滤器,例如...

import java.awt.BorderLayout; 
import java.awt.EventQueue; 
import java.awt.GridBagLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.JComboBox; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.JTextField; 
import javax.swing.RowFilter; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 
import javax.swing.event.DocumentEvent; 
import javax.swing.event.DocumentListener; 
import javax.swing.table.DefaultTableModel; 
import javax.swing.table.TableModel; 
import javax.swing.table.TableRowSorter; 

public class TableFilter { 

    public static void main(String[] args) { 
     new TableFilter(); 
    } 

    private JTable table; 
    private JComboBox filterBy; 
    private JTextField filterText; 

    public TableFilter() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
        ex.printStackTrace(); 
       } 

       DefaultTableModel model = new DefaultTableModel(new Object[]{"Code", "Description"}, 0); 
       model.addRow(new Object[]{"A001", "Holidays"}); 
       model.addRow(new Object[]{"B001", "Sick"}); 
       model.addRow(new Object[]{"A002", "Zombitse"}); 
       model.addRow(new Object[]{"C001", "Crazy bin"}); 
       model.addRow(new Object[]{"C002", "Postal"}); 
       model.addRow(new Object[]{"D002", "Job Interview"}); 
       model.addRow(new Object[]{"D004", "it's sunny outside"}); 

       table = new JTable(model); 
       table.setRowSorter(new TableRowSorter<TableModel>(model)); 

       JPanel filterPane = new JPanel(new GridBagLayout()); 
       filterBy = new JComboBox(new Object[]{"Nothing", "Code", "Description"}); 
       filterText = new JTextField(20); 
       filterPane.add(filterBy); 
       filterPane.add(filterText); 

       filterBy.setSelectedIndex(0); 
       filterBy.addActionListener(new ActionListener() { 
        @Override 
        public void actionPerformed(ActionEvent e) { 
         updateFilter(); 
        } 
       }); 

       filterText.getDocument().addDocumentListener(new DocumentListener() { 
        @Override 
        public void insertUpdate(DocumentEvent e) { 
         updateFilter(); 
        } 

        @Override 
        public void removeUpdate(DocumentEvent e) { 
         updateFilter(); 
        } 

        @Override 
        public void changedUpdate(DocumentEvent e) { 
         updateFilter(); 
        } 
       }); 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(filterPane, BorderLayout.NORTH); 
       frame.add(new JScrollPane(table)); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    protected void updateFilter() { 
     Object selected = filterBy.getSelectedItem(); 
     TableRowSorter<TableModel> sorter = (TableRowSorter<TableModel>) table.getRowSorter(); 
     String text = "(?i)" + filterText.getText(); 
     if ("Nothing".equals(selected)) { 
      sorter.setRowFilter(null); 
     } else { 
      int col = -1; 
      if ("Code".equals(selected)) { 
       col = 0; 
      } else if ("Description".equals(selected)) { 
       col = 1; 
      } 
      sorter.setRowFilter(RowFilter.regexFilter(text, col)); 
     } 
    } 

} 

这个例子演示了实时更新,所以你键入,该表将被过滤。 ..

+0

hmmmm - '如何过滤关于JTable你有没有阅读'从JComboBox中过滤'(RowFilter中的'和'和'nor') – mKorbel 2014-09-25 08:55:40

+0

@mKorbel *“我需要在离开代码时过滤关于离开代码的表数据在组合框中选择,并在组合框中选择离开描述时针对leavedesc进行过滤“* - 因此,当选择”代码“时,数据将根据reg-expr仅针对代码列和相同的描述...不同于OP的代码,它是通过所有列过滤... – MadProgrammer 2014-09-25 09:56:50

+0

好或不好,它应该/可以,但管默认有两个条目:-),然后没有(从隧道右侧)通信由OP – mKorbel 2014-09-25 11:25:34