2014-09-19 51 views
2

我有一个JTable,我想在旁边的JLabel中显示可见的记录数。因此,无论何时在JTable上过滤或执行任何可更改可见行数的操作,我都希望JLabel能够更新新的记录数?我要实现哪种监听器来捕获这些事件?如何捕获JTable过滤器事件?

+0

我猜我问的是你,当我感兴趣的表观看赛事,而不是表型号我用什么事件/监听器? – tmn 2014-09-19 17:46:03

回答

2

Table#getRowCount()实际上返回表视图中的行数。所以你可以在监听器中调用这个方法来记录导致行数改变的事件。不幸的是,我并不知道倾听者对表格行数变化的倾听者

最直接的倾听者(对于您的过滤器案例),您可能可以使用RowSorterListener“通知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(); 
      } 
     }); 
    } 
}