2016-10-07 10 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

単一の列をフィルタリングする実際の例については、Sorting and FilteringのSwingチュートリアルのセクションを参照してください。

キーは、正規表現フィルタを作成するときに列を指定することです。また、パラメータのRowFilter.regexFilter(...)のAPIを確認することもできます。

+0

ありがとう@camickr、あなたの答えは私を助けました。単純でしたが、私は正規表現フィルタでフィルタリングしたいカラムインデックスを定義しなければなりませんでした。私の場合、最初の列でフィルタリングする場合と同じように:RowFilter.regexFilter( "(?i)" + text、selecetedColumn); –

関連する問題