--- a/db.dataview/src/org/netbeans/modules/db/dataview/table/JXTableRowHeader.java +++ a/db.dataview/src/org/netbeans/modules/db/dataview/table/JXTableRowHeader.java @@ -149,7 +149,7 @@ } } - private PropertyChangeListener tableSorterListener = new PropertyChangeListener() { + private PropertyChangeListener backingTableListener = new PropertyChangeListener() { @Override public void propertyChange(PropertyChangeEvent pce) { JTable t = (JTable) pce.getSource(); @@ -161,16 +161,38 @@ backingSorter = (RowSorter) pce.getNewValue(); backingSorter.addRowSorterListener(rowSorterListener); } + updateRowCount(); } else if (pce.getPropertyName().equals("rowHeight")) { headerTable.setRowHeight((Integer) pce.getNewValue()); + } else if ("model".equals(pce.getPropertyName())) { + if(backingTableModel != null) { + backingTableModel.removeTableModelListener( + tableModelListener); + } + backingTableModel = (TableModel) pce.getNewValue(); + if(backingTableModel != null) { + backingTableModel.addTableModelListener(tableModelListener); + } + updateRowCount(); } } }; + + private void updateRowCount() { + ctm.setCount(backingTable.getRowCount()); + } + + private TableModelListener tableModelListener = new TableModelListener() { + @Override + public void tableChanged(TableModelEvent e) { + updateRowCount(); + } + }; private RowSorterListener rowSorterListener = new RowSorterListener() { @Override public void sorterChanged(RowSorterEvent rse) { - ctm.setCount(rse.getSource().getViewRowCount()); + updateRowCount(); } }; @@ -243,6 +265,7 @@ private final CountingTableModel ctm = new CountingTableModel(); private final JXTable headerTable; private JXTable backingTable; + private TableModel backingTableModel; private RowSorter backingSorter; /** @@ -254,14 +277,24 @@ * the table for which to produce a row header. */ public JXTableRowHeader(JXTable table) { + assert table != null: "JXTableRowHeader needs to be instanciated with a JXTable"; + + this.backingTable = table; + this.backingTableModel = table.getModel(); + this.backingTableModel.addTableModelListener(tableModelListener); + + headerTable = new JXTableDecorator(ctm, + new JXTableRowHeader.InternalTableColumnModel()); - headerTable = new JXTableDecorator(ctm, new JXTableRowHeader.InternalTableColumnModel()); - - setTable(table); - + ctm.setCount(backingTable.getRowCount()); + backingTable.addPropertyChangeListener(backingTableListener); + headerTable.setRowHeight(backingTable.getRowHeight()); + headerTable.setSelectionModel(backingTable.getSelectionModel()); + setLayout(new GridLayout(1, 1)); - this.headerTable.getModel().addTableModelListener(new JXTableRowHeader.HeaderResizeListener()); + this.headerTable.getModel().addTableModelListener( + new JXTableRowHeader.HeaderResizeListener()); this.headerTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); this.headerTable.getTableHeader().setReorderingAllowed(false); this.headerTable.getTableHeader().setResizingAllowed(false); @@ -280,8 +313,10 @@ this.headerTable.setInheritsPopupMenu(true); this.headerTable.setShowGrid(true, true); this.headerTable.setGridColor(ResultSetJXTable.GRID_COLOR); - this.headerTable.setHighlighters(HighlighterFactory.createAlternateStriping(ResultSetJXTable.ROW_COLOR, ResultSetJXTable.ALTERNATE_ROW_COLOR)); - } + this.headerTable.setHighlighters( + HighlighterFactory.createAlternateStriping( + ResultSetJXTable.ROW_COLOR, ResultSetJXTable.ALTERNATE_ROW_COLOR)); + } /** * Returns a default renderer to be used when no row header renderer is @@ -295,21 +330,8 @@ return new JXTableRowHeader.RowHeaderColumnRenderer(); } - public void setTable(JXTable table) { - if(backingTable != null) { - backingTable.removePropertyChangeListener(tableSorterListener); - } - backingTable = table; - if(backingTable != null) { - ctm.setCount(backingTable.getRowCount()); - backingTable.addPropertyChangeListener(tableSorterListener); - headerTable.setRowHeight(backingTable.getRowHeight()); - headerTable.setSelectionModel(backingTable.getSelectionModel()); - } - } - @Override public String getToolTipText(MouseEvent event) { return headerTable.getToolTipText(event); } - } +}