2014-09-19 50 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(); 
      } 
     }); 
    } 
}