2

我有一个 JTable,我想在它旁边的 JLabel 中显示可见记录数。因此,每当我对 JTable 进行过滤或执行任何更改可见行数的操作时,我都希望 JLabel 使用新的记录数进行更新?我要实现什么样的侦听器来捕获这些事件?

4

1 回答 1

2

Table#getRowCount()实际上返回表视图中的行数。因此,您可以在任何事件导致行数更改的侦听器中调用该方法。不幸的是,我不知道有任何监听器监听表行计数变化的监听器

最直接的侦听器(对于您的过滤器案例),您可能会使用RowSorterListener" notified of changes to a RowSorter"。您可以执行以下操作:

private void addListenerToSorter(RowSorter rowSorter, 
                           final JTable table, 
                           final JLabel rowCountLabel) {

    rowSorter.addRowSorterListener(new RowSorterListener() {
        @Override
        public void sorterChanged(RowSorterEvent e) {
            int newRowCount = table.getRowCount();
            rowCountLabel.setText("Number of view rows: " + newRowCount);
        }
    });
}

请注意RowSorterEvent,如果您对此感兴趣,还可以获取前一行数。

这是一个完整的例子:

import java.awt.BorderLayout;
import java.util.Vector;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.table.*;

public class TestTableSortFilter {

    private JTable jTable = new JTable(createTableModel());
    private JLabel rowCountLabel = new JLabel();

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

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

    public TestTableSortFilter() {
        jTable.setRowSorter(rowSorter);
        addListenerToSorter(rowSorter, jTable, rowCountLabel);

        JPanel panel = new JPanel(new BorderLayout());
        panel.add(new JLabel("Specify a number to match:"),
                BorderLayout.LINE_START);
        panel.add(jtfFilter, BorderLayout.CENTER);
        panel.add(rowCountLabel, BorderLayout.PAGE_END);

        rowCountLabel.setText("Number of view rows: " + jTable.getRowCount());

        jtfFilter.getDocument().addDocumentListener(new DocumentListener(){
            @Override
            public void insertUpdate(DocumentEvent e) { sortRows(); }
            @Override
            public void removeUpdate(DocumentEvent e) { sortRows(); }
            @Override
            public void changedUpdate(DocumentEvent e) {}

            private void sortRows() {
                String text = jtfFilter.getText();

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

        JFrame frame = new JFrame();
        frame.add(panel, BorderLayout.PAGE_END);
        frame.add(new JScrollPane(jTable), BorderLayout.CENTER);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    private TableModel createTableModel() {
        String[] cols = {"col1", "col2", "col3", "col4"};
        DefaultTableModel model = new DefaultTableModel(cols, 0);
        int value = 0;
        for (int i = 0; i < 100; i++) {
            Vector row = new Vector();
            for (int j = 0; j < cols.length; j++) {
                row.add(value);
                value++;
            }
            model.addRow(row);
        }
        return model;
    }

    private void addListenerToSorter(RowSorter rowSorter, 
                               final JTable table, 
                               final JLabel rowCountLabel) {

        rowSorter.addRowSorterListener(new RowSorterListener() {
            @Override
            public void sorterChanged(RowSorterEvent e) {
                int newRowCount = table.getRowCount();
                rowCountLabel.setText("Number of view rows: " + newRowCount);
            }
        });
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable(){
            public void run() {
                new TestTableSortFilter();
            }
        });
    }
}
于 2014-09-19T18:32:05.140 回答