2016-05-09 7 views
2

Ich möchte eine JTable genau durch eine Zeichenfolge filtern. Mein Filter ist wie folgt:JTable Filterung durch eine exakte Übereinstimmung mit einem String

Pattern.quote(textfield.getText()); 

Aber, wenn ich auf „G“ filtere ich bekommen auch alle Linien des JTable mit dem Eintrag „KG“. Ich möchte nur die Zeilen mit dem Eintrag "G". Ich schaute auf How to Use Tables: Sorting and Filtering, aber ich sehe immer noch nicht wie.

+0

ich bereits diese Website wissen, sagen Sie mir nur, wie die Einträge in der Tabelle mit dem filterText mit voller Anpassung zu vergleichen? – user1104836

Antwort

1

Ein weiteres Beispiel: RowFilter#regexFilter(...) (Java Platform SE 8)

Der zurück Filter verwendet Matcher.find() für die Aufnahme zu testen. Um auf exakte Übereinstimmungen zu prüfen, verwenden Sie die Zeichen '^' und '$', um den Anfang bzw. das Ende der Zeichenkette anzupassen. Zum Beispiel enthält "^ foo $" nur Zeilen, deren Zeichenfolge genau "foo" ist und nicht beispielsweise "food". Eine vollständige Beschreibung der unterstützten Konstrukte für reguläre Ausdrücke finden Sie unter Muster.

import java.awt.*; 
import java.awt.event.*; 
import java.util.regex.*; 
import javax.swing.*; 
import javax.swing.table.*; 

public class JTableFilterDemo2 { 
    public JComponent makeUI() { 
    String[] columnNames = {"Item"}; 
    Object[][] data = {{"G"}, {"KG"}, {"XG"}, {"Y"}, {"Z"}, {"*G"}}; 
    DefaultTableModel model = new DefaultTableModel(data, columnNames); 
    TableRowSorter<TableModel> sorter = new TableRowSorter<>(model); 
    JTable table = new JTable(model); 
    table.setRowSorter(sorter); 

    JTextField textField = new JTextField("G"); 

    JButton button = new JButton("Toggle filter"); 
    button.addActionListener(e -> { 
     if (sorter.getRowFilter() != null) { 
     sorter.setRowFilter(null); 
     } else { 
     String text = Pattern.quote(textField.getText()); 
     String regex = String.format("^%s$", text); 
     sorter.setRowFilter(RowFilter.regexFilter(regex)); 
     } 
    }); 

    JPanel p = new JPanel(new BorderLayout()); 
    p.add(textField, BorderLayout.NORTH); 
    p.add(new JScrollPane(table)); 
    p.add(button, BorderLayout.SOUTH); 
    return p; 
    } 
    public static void main(String[] args) { 
    EventQueue.invokeLater(() -> { 
     JFrame f = new JFrame(); 
     f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
     f.getContentPane().add(new JTableFilterDemo2().makeUI()); 
     f.setSize(320, 240); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
    }); 
    } 
} 
+0

Genau das habe ich gebraucht, danke. – user1104836

3

Verwenden Sie wie in How to Use Tables: Sorting and Filtering gezeigt eine RowFilter, um "Einträge aus dem Modell herauszufiltern, damit sie nicht in der Ansicht angezeigt werden." Passend „G“ genau in der Spalte Null, Ihre Filter könnten wie folgt aussehen:

final RowFilter<TableModel, Integer> filter = new RowFilter<TableModel, Integer>() { 
    @Override 
    public boolean include(RowFilter.Entry<? extends TableModel, ? extends Integer> entry) { 
     return "G".equals(entry.getStringValue(0)); 
    } 
}; 

Basierend auf diesen example Drücken der Taste im Beispiel unten die Filter schaltet.

image

import java.awt.BorderLayout; 
import java.awt.event.ActionEvent; 
import javax.swing.*; 
import javax.swing.table.DefaultTableModel; 
import javax.swing.table.TableModel; 
import javax.swing.table.TableRowSorter; 

/** https://stackoverflow.com/a/37114447/230513 */ 
public class JTableFilterDemo { 

    private static TableRowSorter<TableModel> sorter; 
    private Object[][] data = {{"G"}, {"KG"}, {"XG"}, {"Y"}, {"Z"}}; 
    private String columnNames[] = {"Item"}; 
    private TableModel model = new DefaultTableModel(data, columnNames) { 
     @Override 
     public Class<?> getColumnClass(int column) { 
      return String.class; 
     } 
    }; 
    private JTable table = new JTable(model); 

    public JTableFilterDemo() { 
     table.setPreferredScrollableViewportSize(table.getPreferredSize()); 
     sorter = new TableRowSorter<>(model); 
     table.setRowSorter(sorter); 
     final RowFilter<TableModel, Integer> filter = new RowFilter<TableModel, Integer>() { 
      @Override 
      public boolean include(RowFilter.Entry<? extends TableModel, ? extends Integer> entry) { 
       return "G".equals(entry.getStringValue(0)); 
      } 
     }; 
     JScrollPane scrollPane = new JScrollPane(table); 
     JFrame frame = new JFrame("Filtering Table"); 
     frame.add(new JButton(new AbstractAction("Toggle filter") { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       if (sorter.getRowFilter() != null) { 
        sorter.setRowFilter(null); 
       } else { 
        sorter.setRowFilter(filter); 
       } 
      } 
     }), BorderLayout.SOUTH); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(scrollPane); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       JTableFilterDemo jtfd = new JTableFilterDemo(); 
      } 
     }); 
    } 
}