DocumentListener上的JTable过滤器无法正常工作

时间:2014-03-10 02:16:34

标签: java swing jtable jtextfield rowfilter

  //Registration filter
    final TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(databaseModel);
    DocumentListener idListener = new DocumentListener() {

        public void changedUpdate(DocumentEvent documentEvent) {

        }
        public void insertUpdate(DocumentEvent documentEvent) {
            String searchText = txtReg.getText();
            if (searchText.length() == 0) {
              sorter.setRowFilter(null);
            } else {
              sorter.setRowFilter(RowFilter.regexFilter(searchText));
            }
            numberOfRecords.setText(searchTable.getRowCount() + " records");
        }
        public void removeUpdate(DocumentEvent documentEvent) {

            }


    };
   txtReg.getDocument().addDocumentListener(idListener);

我又来了,这可能是一些愚蠢的问题... :(我有一个JTable,我想在文本字段输入时过滤掉。经过研究,我想出了这个,但它不起作用!如果我把过滤器放在监听器之外,用任意字符串作为搜索词,它就能很好地工作。我错过了什么?谢谢!

public class GUI extends JFrame {
private static final long serialVersionUID = -7968397937566078184L;
private static final JLabel numberOfRecords = new JLabel();
private static int numberOfRows;
private static DefaultTableModel databaseModel;



public GUI(DefaultTableModel database){
    setDefaultLookAndFeelDecorated(true);
    setLayout(new MigLayout());
    databaseModel = database;
    //Menus
    JMenuBar menubar = new JMenuBar();
    JMenu file = new JMenu("File");
    JMenuItem update = new JMenuItem("Look for database updates");
    JMenuItem settings = new JMenuItem("Settings");
    JMenuItem exit = new JMenuItem("Exit");
    menubar.add(file);
    file.add(update);
    file.add(settings);
    file.add(exit);
    setJMenuBar(menubar);
     //Top section
    JPanel searchSection = new JPanel();
    searchSection.setLayout(new MigLayout("w 50mm!"));
    final JTextField txtReg = new JTextField(10);
    JLabel searchID = new JLabel("Current registration:");
    JLabel lblManufacturer = new JLabel("Manufacturer");
    JComboBox cmbManufacturer = new JComboBox();
    JLabel lblType = new JLabel("Type");
    JComboBox cmbType = new JComboBox();
    //Build main window
    searchSection.add(searchID);
    searchSection.add(txtReg, "span 2");
    searchSection.add(lblManufacturer);
    searchSection.add(cmbManufacturer, "growx, span 2");
    searchSection.add(lblType);
    searchSection.add(cmbType,"growx, span 2");
    //Table
    final JTable searchTable = new JTable(databaseModel);
    //Pack table, still have to figure this one out
    int width = 0;
     for (int row = 0; row < searchTable.getRowCount(); row++) {
         TableCellRenderer renderer = searchTable.getCellRenderer(row, 2);
         Component comp = searchTable.prepareRenderer(renderer, row, 2);
         width = Math.max (comp.getPreferredSize().width, width);
     }

    searchTable.getColumn("Key").setMaxWidth(0);
    searchTable.getColumn("Key").setMinWidth(0);
    searchTable.setRowSelectionAllowed(true);
    searchTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    searchTable.setAutoCreateRowSorter(true);
    searchTable.getRowSorter().toggleSortOrder(1);
    searchTable.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
    numberOfRows=searchTable.getRowCount();
    JScrollPane browserSP = new JScrollPane(searchTable);
    browserSP.setBorder(BorderFactory.createEmptyBorder(0, 4, 4, 4));
    setTitle("AirBase");
    setSize(1300,700);
    setMinimumSize(new Dimension(1250,650));
    setExtendedState(JFrame.MAXIMIZED_BOTH);
    setLocationRelativeTo(null);
    setDefaultCloseOperation(EXIT_ON_CLOSE);

    //TODO Fill manufacturer box

    //Registration filter
    //TODO Fix this!
    final TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(databaseModel);
    DocumentListener idListener = new DocumentListener() {

        public void changedUpdate(DocumentEvent documentEvent) {

        }
        public void insertUpdate(DocumentEvent documentEvent) {
            String searchText = txtReg.getText();
            if (searchText.length() == 0) {
              sorter.setRowFilter(null);
            } else {
              sorter.setRowFilter(RowFilter.regexFilter(searchText));
            }
            numberOfRecords.setText(searchTable.getRowCount() + " records");
        }
        public void removeUpdate(DocumentEvent documentEvent) {

            }


    };
   txtReg.getDocument().addDocumentListener(idListener);
    add(searchSection, "w 100%, h 5%, wrap");
    add(browserSP,"w 100%, h 95%, wrap");
    numberOfRecords.setFont(numberOfRecords.getFont().deriveFont(9.0f));
    numberOfRecords.setText(numberOfRows + " RECORDS");
    add(numberOfRecords, "alignx center");
}



}

1 个答案:

答案 0 :(得分:3)

所以我最终开始了。看起来像一个简单的错误。你忘记了表的setRowSorter

searchTable.setRowSorter(sorter);

添加了适用于我的代码。应该为你工作两个,给你一个有效的TableModel传递给GUI。我刚刚组成了一个假人。

注意:

  • 您可能还希望将过滤器代码添加到removeUpdate,在DocumentListener中,因此当文本退格时,它仍会过滤

  • searchTable.getColumn("Key").setMaxWidth(0);使行数据不可见。那是你真正想要的吗?

  • 如果您希望过滤器在没有区分大小写的情况下进行过滤,则可以使用此

    sorter.setRowFilter(RowFilter.regexFilter("(?i)" + searchText));
    

    "(?i)"是案例性的正则表达式“flag”