2013-10-14 2 views
0

Я ввожу имя на моем поле JTextfield, но мой стол не фильтрует ничего!JTable Row фильтрация по значению JTextField

Мой код:

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); 
} 
+0

Почему вы не читаете Swing-учебник по ' Как использовать таблицы для рабочего примера ??? Вы уже много раз получали ссылки на учебник. – camickr

ответ

7

Вы звоните RowFilter.regexFilter(filterTF.getText(), 0); в UserPage_Admin() конструктор. Как он должен читать текст из фильтра TF. Я думаю, вы должны назвать его от действий прослушивателя событий, присвоенного JButton, который будет вызываться при подаче (щелчок) текста следующим образом:

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)); 
     } 
     } 
    }); 

Если вы хотите использовать фильтрацию на событиях пользовательского типа ключа, добавьте key listener в текстовое поле вы берете входную фильтрующую строку.

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

Однако, как это предложено в комментариях ниже, чтобы работать с Свинг компонент текста, один должен был использовать Document.addDocumentListener(DocumentListener). Текстовый компонент Swing использует Document для представления его содержимого. События документа происходят, когда содержимое документа каким-либо образом изменяется. Добавьте документ слушателя следующим образом:

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: Почему DocumentListener предпочтительнее?

Если мы хотим проверки входных данных в источнике данных, используя KeyEvent при фильтрации данных вы найдете, что это не отражает нажатия клавиш и события ввода данные пользователя отправляются на слушателей, прежде чем они обрабатываются в источнике данных. предположим, что, когда мы хотим ввести user name, кто-то вводит текст, например "$%^&". При таком недопустимом входе KeyEvent все равно будет запущен, даже если в источник данных не были внесены изменения. Но, DocumentListeners уведомляются только в том случае, если в источник данных были внесены действительные изменения. Компоненты ввода данных создают события, в которых validator может прослушивать asynchronously, никогда не должно быть modify the contents текстового компонента из DocumentListener. Если мы это сделаем, программа, скорее всего, закроется.

+0

Приятно, но можете ли вы написать код, который не нужен для кнопки, и когда я ввожу имя, таблица должна автоматически фильтровать его. – Sajad

+0

да также возможно. подождите 1 мин. – Sage

+0

обновил ответ, посмотрим, поможет ли он! – Sage

0

Вы просто не в состоянии использовать сортировщик после его инициализации. Вы должны позвонить по номеру JTable.setRowSorter().

+0

Я добавляю 'table.setRowSorter (сортировщик);', но не получается! – Sajad

+0

hmm - помощь нижнего уровня, чтобы объяснить? Это очевидное упущение в фрагменте, предоставленном OP и как таковой хороший первый улов. – kleopatra

1

Я ввожу имя на мое поле JTextfield, но мой стол не фильтрует ничего!

  • есть два пути, вы не выше ожидаемого логик

    1. фильтрация KeyTyped из DocumentListener (код говорить о ???)

    2. из ActionListener вызывается от ENTER Ключ

  • оба м.способы добавлены в JTextField


  • , то есть еще два очень важных опций

    1. фильтрации в целом JTable: столбцы и строки (код говорить о ???)

    2. в одном (вполне возможно в двух или более, никогда не используемых) столбцах


  • все зависит от вашей цели

  • все, используя стандартные методы, реализованные в API

+0

Приятно, я хочу, чтобы фильтрация с помощью ввода и фильтрации ключей в целой таблице. – Sajad

+0

, тогда самый простой способ - следовать [пример кода - TableFilterDemo] (http://docs.oracle.com/javase/tutorial/displayCode.html?code=http://docs.oracle.com/javase/tutorial/uiswing /examples/components/TableFilterDemoProject/src/components/TableFilterDemo.java) из официального руководства Oracle [Как использовать таблицы - Сортировка и фильтрация] (http://docs.oracle.com/javase/tutorial/uiswing/components/table. HTML # сортировки) – mKorbel

Смежные вопросы