2016-05-09 19 views
2

JTableを文字列で正確にフィルタリングしたいと思います。私はまた、エントリ「KG」とJTableのすべての行を取得し、「G」でフィルタする場合、JTableは文字列との完全一致でフィルタリングします

Pattern.quote(textfield.getText()); 

しかし:私のフィルタはこのようなものです。私はちょうどエントリ "G"で行をしたい。私はHow to Use Tables: Sorting and Filteringを見ましたが、私はまだどのように見えません。

+0

私はすでにどれだけfilterTextとの完全な一致を持つテーブル内のエントリを比較することを教えて、このサイトを知っていますか? – user1104836

答えて

1

別の例:RowFilter#regexFilter(...) (Java Platform SE 8)

返さフィルタが包含をテストするためにMatcher.find()を使用します。完全一致をテストするには、 '^'と '$'を使用して文字列の先頭と末尾をそれぞれ一致させます。たとえば、 "^ foo $"には文字列が正確に "foo"であり、 "food"などではない行のみが含まれます。サポートされている正規表現構文の詳細については、Patternを参照してください。

import java.awt.*; 
import java.awt.event.*; 
import java.util.regex.*; 
import javax.swing.*; 
import javax.swing.table.*; 

public class JTableFilterDemo2 { 
    public JComponent makeUI() { 
    String[] columnNames = {"Item"}; 
    Object[][] data = {{"G"}, {"KG"}, {"XG"}, {"Y"}, {"Z"}, {"*G"}}; 
    DefaultTableModel model = new DefaultTableModel(data, columnNames); 
    TableRowSorter<TableModel> sorter = new TableRowSorter<>(model); 
    JTable table = new JTable(model); 
    table.setRowSorter(sorter); 

    JTextField textField = new JTextField("G"); 

    JButton button = new JButton("Toggle filter"); 
    button.addActionListener(e -> { 
     if (sorter.getRowFilter() != null) { 
     sorter.setRowFilter(null); 
     } else { 
     String text = Pattern.quote(textField.getText()); 
     String regex = String.format("^%s$", text); 
     sorter.setRowFilter(RowFilter.regexFilter(regex)); 
     } 
    }); 

    JPanel p = new JPanel(new BorderLayout()); 
    p.add(textField, BorderLayout.NORTH); 
    p.add(new JScrollPane(table)); 
    p.add(button, BorderLayout.SOUTH); 
    return p; 
    } 
    public static void main(String[] args) { 
    EventQueue.invokeLater(() -> { 
     JFrame f = new JFrame(); 
     f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
     f.getContentPane().add(new JTableFilterDemo2().makeUI()); 
     f.setSize(320, 240); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
    }); 
    } 
} 
+0

それはまさに私が必要なものです、ありがとう。 – user1104836

3

How to Use Tables: Sorting and Filteringに示すように、RowFilterを使用して、「モデルからエントリを除外して、ビューに表示されないようにします」。まさにゼロ列目に「G」を一致させるには、あなたのフィルタは次のようになります。このexampleに基づいて

final RowFilter<TableModel, Integer> filter = new RowFilter<TableModel, Integer>() { 
    @Override 
    public boolean include(RowFilter.Entry<? extends TableModel, ? extends Integer> entry) { 
     return "G".equals(entry.getStringValue(0)); 
    } 
}; 

、以下の例では、ボタンを押すと、フィルタを切り替えます。

image

import java.awt.BorderLayout; 
import java.awt.event.ActionEvent; 
import javax.swing.*; 
import javax.swing.table.DefaultTableModel; 
import javax.swing.table.TableModel; 
import javax.swing.table.TableRowSorter; 

/** https://stackoverflow.com/a/37114447/230513 */ 
public class JTableFilterDemo { 

    private static TableRowSorter<TableModel> sorter; 
    private Object[][] data = {{"G"}, {"KG"}, {"XG"}, {"Y"}, {"Z"}}; 
    private String columnNames[] = {"Item"}; 
    private TableModel model = new DefaultTableModel(data, columnNames) { 
     @Override 
     public Class<?> getColumnClass(int column) { 
      return String.class; 
     } 
    }; 
    private JTable table = new JTable(model); 

    public JTableFilterDemo() { 
     table.setPreferredScrollableViewportSize(table.getPreferredSize()); 
     sorter = new TableRowSorter<>(model); 
     table.setRowSorter(sorter); 
     final RowFilter<TableModel, Integer> filter = new RowFilter<TableModel, Integer>() { 
      @Override 
      public boolean include(RowFilter.Entry<? extends TableModel, ? extends Integer> entry) { 
       return "G".equals(entry.getStringValue(0)); 
      } 
     }; 
     JScrollPane scrollPane = new JScrollPane(table); 
     JFrame frame = new JFrame("Filtering Table"); 
     frame.add(new JButton(new AbstractAction("Toggle filter") { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       if (sorter.getRowFilter() != null) { 
        sorter.setRowFilter(null); 
       } else { 
        sorter.setRowFilter(filter); 
       } 
      } 
     }), BorderLayout.SOUTH); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(scrollPane); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       JTableFilterDemo jtfd = new JTableFilterDemo(); 
      } 
     }); 
    } 
} 
関連する問題