2016-10-07 2 views
1

Мне нужно динамически фильтровать JTable по значению из определенного столбца. Поэтому, если у меня есть 2 столбца, например «Страна» и «Капитал», я хочу фильтровать только по столбцу Страна. я нашел часть решения моей проблемы путем выполнения этого кода:Фильтровать динамически jTable по значению столбца

import java.awt.BorderLayout; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.JTextField; 
import javax.swing.RowFilter; 
import javax.swing.SwingUtilities; 
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 TestTableSortFilter extends JPanel { 

    private String[] columnNames 
      = {"Country", "Capital", "Population in Millions", "Democracy"}; 

    private Object[][] data = { 
     {"USA", "Washington DC", 280, true}, 
     {"Canada", "Ottawa", 32, true}, 
     {"United Kingdom", "London", 60, true}, 
     {"Germany", "Berlin", 83, true}, 
     {"France", "Paris", 60, true}, 
     {"Norway", "Oslo", 4.5, true}, 
     {"India", "New Delhi", 1046, true} 
    }; 

    private DefaultTableModel model = new DefaultTableModel(data, columnNames); 
    private JTable jTable = new JTable(model); 

    private TableRowSorter<TableModel> rowSorter 
      = new TableRowSorter<>(jTable.getModel()); 

    private JTextField jtfFilter = new JTextField(); 
    private JButton jbtFilter = new JButton("Filter"); 

    public TestTableSortFilter() { 
     jTable.setRowSorter(rowSorter); 

     JPanel panel = new JPanel(new BorderLayout()); 
     panel.add(new JLabel("Specify a word to match:"), 
       BorderLayout.WEST); 
     panel.add(jtfFilter, BorderLayout.CENTER); 

     setLayout(new BorderLayout()); 
     add(panel, BorderLayout.SOUTH); 
     add(new JScrollPane(jTable), BorderLayout.CENTER); 

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

      @Override 
      public void insertUpdate(DocumentEvent e) { 
       String text = jtfFilter.getText(); 

       if (text.trim().length() == 0) { 
        rowSorter.setRowFilter(null); 
       } else { 
        rowSorter.setRowFilter(RowFilter.regexFilter("(?i)" + text)); 
       } 
      } 

      @Override 
      public void removeUpdate(DocumentEvent e) { 
       String text = jtfFilter.getText(); 

       if (text.trim().length() == 0) { 
        rowSorter.setRowFilter(null); 
       } else { 
        rowSorter.setRowFilter(RowFilter.regexFilter("(?i)" + text)); 
       } 
      } 

      @Override 
      public void changedUpdate(DocumentEvent e) { 
       throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. 
      } 

     }); 
    } 

Проблема заключается в том, когда я фильтровать таблицу, фильтрует его всеми колоннами, а не одной конкретной. Благодарим вас за помощь.

ответ

3

Прочтите раздел из учебника Swing по Sorting and Filtering для рабочего примера, который фильтрует один столбец.

Ключ должен указывать столбец при создании фильтра регулярных выражений. Вы также можете проверить API для параметров RowFilter.regexFilter(...).

+0

Спасибо @camickr, ваш ответ мне помог. Это было просто, мне просто нужно было указать индекс столбца, который я хотел бы фильтровать в фильтр регулярных выражений. Как и в моем случае для фильтрации по первому столбцу: RowFilter.regexFilter ("(? I)" + text, selecetedColumn); –

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