package com.revolsys.swing.table; import java.awt.Dimension; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.text.DecimalFormat; import java.text.NumberFormat; import javax.swing.BorderFactory; import javax.swing.JLabel; import javax.swing.border.BevelBorder; import javax.swing.event.TableModelEvent; import javax.swing.event.TableModelListener; import javax.swing.table.TableModel; public class TableRowCount extends JLabel implements TableModelListener, PropertyChangeListener { private static final long serialVersionUID = 1L; private TableModel model; private BaseJTable table; private int rowCount; public TableRowCount(final BaseJTable table) { setToolTipText("Record Count"); setBorder( BorderFactory.createCompoundBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED), BorderFactory.createEmptyBorder(2, 5, 2, 5))); setHorizontalAlignment(RIGHT); this.table = table; table.addPropertyChangeListener("rowFilterChanged", this); this.model = table.getModel(); // Table events are in reverse order. The following moves this listener to // be performed after that table's listener. Otherwise the counts maybe // wrong. this.model.removeTableModelListener(table); this.model.addTableModelListener(this); this.model.addTableModelListener(table); tableChanged(null); } public int getRowCount() { return this.rowCount; } @Override public void propertyChange(final PropertyChangeEvent evt) { updateCount(); } @Override public void removeNotify() { if (this.table != null) { this.table.removePropertyChangeListener("rowFilterChanged", this); this.table = null; } if (this.model != null) { this.model.removeTableModelListener(this); this.model = null; } super.removeNotify(); } @Override public void tableChanged(final TableModelEvent e) { updateCount(); } private void updateCount() { final Dimension size = new Dimension(100, 22); setPreferredSize(size); setMaximumSize(size); final NumberFormat format = new DecimalFormat("#,##0"); final int tableRowCount = this.table.getRowCount(); final int modelRowCount = this.model.getRowCount(); final int oldValue = this.rowCount; this.rowCount = tableRowCount; final String text; if (tableRowCount == modelRowCount) { text = format.format(tableRowCount); setToolTipText(null); } else { text = "<html><b color='red'>" + format.format(tableRowCount) + "</b> of " + format.format(modelRowCount) + "</html>"; setToolTipText("The table is filtered so some records are hidden from view."); } setText(text); firePropertyChange("rowCount", oldValue, this.rowCount); } }