# RowFilter Jtable



## --- (15. Jan 2009)

Hallo,

bin jetzt ein Stück weiter, als vorheriger Post.
Ziel ist nach Eingabe z.B. "B" in ein Textfeld, in JTable table nur noch die Einträge mit keys, die mit "B" beginnen darzustellen.

Was funktioniert ist, dass die Eingabe von einem Textfeld an
sorter.setRowFilter(RowFilter.regexFilter(text)); weitergegeben wird.
Problem ist jetzt, dass keine Daten mehr im JTable angezeigt werden, JTable ist nach setRowFilter leer. JTable wird von MapTableModel extends AbstractTableModel befüllt. 



```
DocumentListener documentListener = new DocumentListener() {
                public void changedUpdate(DocumentEvent documentEvent) {
                  printIt(documentEvent);
                }
                public void insertUpdate(DocumentEvent documentEvent) {
                  printIt(documentEvent);
                }
                public void removeUpdate(DocumentEvent documentEvent) {
                  printIt(documentEvent);
                }
                private void printIt(DocumentEvent documentEvent) {
                  DocumentEvent.EventType type = documentEvent.getType();
                  if (type.equals(DocumentEvent.EventType.CHANGE)) {
                   
                  }  else if (type.equals(DocumentEvent.EventType.INSERT)) {
                	  wordToFindInsert();
                  }  else if (type.equals(DocumentEvent.EventType.REMOVE)) {
                   
                  }
                  
                }
              };
```


```
private void wordToFindInsert()
    {	  
        String text = wordToFind.getText();
        if (text.length() == 0) 
        {
              sorter.setRowFilter(null);
        } 
        else 
        {        	
          try 
          {
            sorter.setRowFilter(RowFilter.regexFilter(text));
            //ble.getRowSorter().getSortKeys();              
          } 
          catch (PatternSyntaxException pse) {
          System.err.println("Bad regex pattern");
          }
        }      
    }
```


Ich habe ein Bsp. von google (weis den Link nicht mehr). Bis auf den Unterschied, dass dort die Daten in Object rows gespeichert sind, ist mir kein Unterschied zu sehen. Wie ist der Zusammen´han zwischen view-JTable und Daten-JTableModel? Mit dem RowFilter möchte ich nur JTable "durchsuchen" und nicht das Model.

```
public class FilterTable {
      public static void main(String args[]) {
            Runnable runner = new Runnable() {
                  public void run() {
                        JFrame frame = new JFrame("Sorting JTable");
                        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                        Object rows[][] = { { "AMZN", "Amazon", 41.28 },
                                    { "EBAY", "eBay", 41.57 },
                                    { "GOOG", "Google", 388.33 },
                                    { "MSFT", "Microsoft", 26.56 },
                                    { "NOK", "Nokia Corp", 17.13 },
                                    { "ORCL", "Oracle Corp.", 12.52 },
                                    { "SUNW", "Sun Microsystems", 3.86 },
                                    { "TWX", "Time Warner", 17.66 },
                                    { "VOD", "Vodafone Group", 26.02 },
                                    { "YHOO", "Yahoo!", 37.69 } };
                        Object columns[] = { "Symbol", "Name", "Price" };
                        TableModel model = new DefaultTableModel(rows, columns) {
                              public Class getColumnClass(int column) {
                                    Class returnValue;
                                    if ((column >= 0) && (column < getColumnCount())) {
                                          returnValue = getValueAt(0, column).getClass();
                                    } else {
                                          returnValue = Object.class;
                                    }
                                    return returnValue;
                              }
                        };
                        JTable table = new JTable(model);
                            //Notice this line below:            
                                final TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(
                                    model);
                        table.setRowSorter(sorter);
                        JScrollPane pane = new JScrollPane(table);
                        frame.add(pane, BorderLayout.CENTER);
                        JPanel panel = new JPanel(new BorderLayout());
                        JLabel label = new JLabel("Filter");
                        panel.add(label, BorderLayout.WEST);
                        final JTextField filterText = new JTextField("SUN");
                        panel.add(filterText, BorderLayout.CENTER);
                        frame.add(panel, BorderLayout.NORTH);
                        JButton button = new JButton("Filter");
                        button.addActionListener(new ActionListener() {
                              public void actionPerformed(ActionEvent e) {
                                    String text = filterText.getText();
                                    if (text.length() == 0) {
                                          sorter.setRowFilter(null);
                                    } else {
                                          try {
                                                sorter
                                                            .setRowFilter(RowFilter
                                                                        .regexFilter(text));
                                          } catch (PatternSyntaxException pse) {
                                                System.err.println("Bad regex pattern");
                                          }
                                    }
                              }
                        });
                        frame.add(button, BorderLayout.SOUTH);
                        frame.setSize(300, 250);
                        frame.setVisible(true);
                  }
            };
            EventQueue.invokeLater(runner);
      }
}
```

schon mal vielen Dank..


----------



## Beni (15. Jan 2009)

Gross- Kleinschreibung stimmt? (Bei deiner Eingabe verglichen zu den Werten in der Tabelle).

Der Wert von "text" stimmt auch?

Ansonsten wäre das nicht funktionierende Programm hilfreicher als das funktionierende Beispiel :wink:


----------



## --- (15. Jan 2009)

Hab Groß/Kleinschreibung nicht beachtet.
Vielen Dank und das ohne das Prog zu sehen!


----------



## --- (15. Jan 2009)

Eine Frage hab ich noch...

Wie kann ich dem setRowFilter sagen, dass nur der key der Jtable gefiltert werden soll?
mit folgendem Code wird weiterhin key und value gefiltert.


```
sorter.setRowFilter(RowFilter.regexFilter(text));
 table.getRowSorter().getSortKeys();
```

Danke schon mal.


----------



## Beni (15. Jan 2009)

Die API meint, dass man der Methode "refexFilter" noch Indices übergeben kann. Wenn in der Spalte 0 deine Keys sind, müsste das so aussehen (habs nicht ausprobiert):

```
sorter.setRowFilter(RowFilter.regexFilter(text, 0));
```


----------



## --- (15. Jan 2009)

Danke, klappt!


----------

