【问题标题】:JTable filtering by an exact match to a StringJTable 通过与字符串的完全匹配进行过滤
【发布时间】:2016-05-09 08:52:07
【问题描述】:

我想通过字符串过滤JTable。我的过滤器是这样的:

Pattern.quote(textfield.getText());

但是,当我对“G”进行过滤时,我还会得到 JTable 的所有行,其中包含条目“KG”。我只想要条目“G”的行。我看了How to Use Tables: Sorting and Filtering,还是不明白。

【问题讨论】:

  • 我已经知道这个网站了,请告诉我如何将表格中的条目与filterText进行完全匹配?

标签: java string swing jtable rowfilter


【解决方案1】:

How to Use Tables: Sorting and Filtering 所示,使用RowFilter 来“过滤掉模型中的条目,以便它们不会显示在视图中”。要准确匹配第 0 列中的“G”,您的过滤器可能如下所示:

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

基于此example,按下下例中的按钮将切换过滤器。

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

【讨论】:

    【解决方案2】:

    另一个例子: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);
        });
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2022-12-17
      • 1970-01-01
      • 1970-01-01
      • 2013-04-29
      • 1970-01-01
      • 1970-01-01
      • 2022-01-10
      • 1970-01-01
      • 2021-12-09
      相关资源
      最近更新 更多