Question

I enter a name on my JTextfield , But my table don't filter any thing!

My code:

public class UserPage_Admin extends JFrame {

JTable table;
UserModel model;
public UserPage_Admin() {

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

    add(new JScrollPane(table), BorderLayout.CENTER);
    add(panelForm(), BorderLayout.PAGE_START);

    RowFilter<UserModel, Object> rf = null;
    try {
        rf = RowFilter.regexFilter(filterTF.getText(), 0);
    } catch (PatternSyntaxException pse) {
        return;
    }
    sorter.setRowFilter(rf);

    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setSize(850, 600);
    setVisible(true);
}
Was it helpful?

Solution

you are calling RowFilter.regexFilter(filterTF.getText(), 0); in UserPage_Admin() constructor. How it supposed to read the text from the filterTF. I think you should call it from an Action Event Listener assigned to a JButton which will be called upon submitting(clicking) the text as follows:

submitButton.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        String text = filterText.getText();
        if (text.length() == 0) {
          sorter.setRowFilter(null);
        } else {
          sorter.setRowFilter(RowFilter.regexFilter(text, 0));
        }
      }
    }); 

If you want to use Filtering upon user key type event, add key listener to the text field you are taking input filter-string.

filterTxtFeild.addKeyListener(new KeyAdapter() {
            public void keykeyReleased(KeyEvent evt) {
              // on each key type event filter. 
             // put your filter code as submit button
            }
        });

However, as it is suggested in the comments below, to work with Swing Text Component, one should have used the Document.addDocumentListener(DocumentListener). A Swing text component uses a Document to represent its content. Document events occur when the content of a document changes in any way. Add the document listener as follows:

filterTxtFeild.getDocument().addDocumentListener(new DocumentListener() {

      @Override
      public void insertUpdate(DocumentEvent e) {
        // put your filter code here upon data insertion
      }

      @Override
      public void removeUpdate(DocumentEvent e) 
      { 
            //put your filter code here upon data removal
      }

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

Edit: Why DocumentListener is preferable ?

If we want validation of input in the data source, using KeyEvent while filtering the data you’ll find it does not reflect the user’s keystroke and input events are sent to the listeners before they are processed by the data source. suppose that when we want an user name to be entered, someone input a text like "$%^&". On such invalid input, KeyEvent will still be fired even though no valid changes has been made to data source. But, DocumentListeners are notified only when a valid changes has been made to the data source. Data entry components produce events in which a validator can listen for asynchronously, one should never modify the contents of a text component from within a DocumentListener. If we do so, the program will likely deadlock.

OTHER TIPS

I enter a name on my JTextfield , But my table don't filter any thing!

  • there are two ways, you don't mentioned expected logics

    1. filtering on KeyTyped from DocumentListener (your code talking about ???)

    2. from ActionListener invoked from ENTER Key

  • both a.m. ways added to JTextField


  • then there are another two very important options

    1. filtering in whole JTables, columns and rows (your code talking about ???)

    2. in one (quite possible in two or more, never tried) columns


  • everything depends of your goal

  • everything by using standard methods implemented in API

You simply fail to use sorter after initializing it. You should call JTable.setRowSorter().

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top