Skip to content

Commit 1d4a0ab

Browse files
committed
columnMarginChanged should be called, so the repainting was moved from columnModel to table itself.
1 parent f2af674 commit 1d4a0ab

File tree

3 files changed

+111
-39
lines changed

3 files changed

+111
-39
lines changed

src/org/quinto/swing/table/view/JBroTable.java

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package org.quinto.swing.table.view;
22

33
import java.awt.Component;
4+
import java.awt.Container;
5+
import java.awt.Dimension;
46
import java.awt.Rectangle;
57
import java.awt.event.AdjustmentEvent;
68
import java.awt.event.AdjustmentListener;
@@ -9,9 +11,11 @@
911
import java.beans.PropertyChangeEvent;
1012
import java.beans.PropertyChangeListener;
1113
import java.util.ArrayList;
14+
import java.util.Enumeration;
1215
import java.util.Iterator;
1316
import java.util.LinkedHashMap;
1417
import java.util.LinkedHashSet;
18+
import java.util.Set;
1519
import java.util.regex.Matcher;
1620
import java.util.regex.Pattern;
1721
import javax.swing.JScrollBar;
@@ -581,6 +585,70 @@ public void sorterChanged( RowSorterEvent e ) {
581585
super.sorterChanged( e );
582586
}
583587

588+
@Override
589+
public void columnMarginChanged( ChangeEvent e ) {
590+
if ( !( e instanceof JBroTableColumnModel.WidthChangeEvent ) ) {
591+
super.columnMarginChanged( e );
592+
return;
593+
}
594+
JBroTableColumnModel.WidthChangeEvent we = ( JBroTableColumnModel.WidthChangeEvent )e;
595+
JBroTableColumn column = we.getColumn();
596+
JBroTableHeader header = getTableHeader();
597+
TableColumnModel columnModel = header == null ? getColumnModel() : header.getColumnModel();
598+
Enumeration< TableColumn > cols = columnModel.getColumns();
599+
int x = 0;
600+
int idx = 0;
601+
while ( cols.hasMoreElements() ) {
602+
TableColumn col = cols.nextElement();
603+
if ( col == column )
604+
break;
605+
x += col.getWidth();
606+
idx++;
607+
}
608+
if ( getUI() != null ) {
609+
Set< String > spannedColumns = getUI().getSpannedColumns();
610+
if ( spannedColumns.contains( column.getIdentifier() ) ) {
611+
for ( ; idx >= 0; idx-- ) {
612+
TableColumn col = columnModel.getColumn( idx );
613+
if ( spannedColumns.contains( ( String )col.getIdentifier() ) )
614+
x -= col.getWidth();
615+
else
616+
break;
617+
}
618+
}
619+
}
620+
if ( isEditing() && !getCellEditor().stopCellEditing() )
621+
getCellEditor().cancelCellEditing();
622+
Container parent = getParent() == null ? null : getParent().getParent();
623+
if ( getAutoResizeMode() == JTable.AUTO_RESIZE_OFF && header != null && header.getResizingColumn() == column && ( parent == null || parent instanceof JScrollPane ) ) {
624+
if ( column.getPreferredWidth() != column.getWidth() ) {
625+
Dimension size = getPreferredSize();
626+
int oldW = column.getPreferredWidth();
627+
column.setPreferredWidth( column.getWidth() );
628+
int newW = column.getPreferredWidth();
629+
size.width += newW - oldW;
630+
setPreferredSize( size );
631+
if ( parent != null ) {
632+
JScrollPane scrollPane = ( JScrollPane )parent;
633+
scrollPane.getHorizontalScrollBar().getModel().setMaximum( size.width );
634+
}
635+
}
636+
} else
637+
revalidate();
638+
if ( header == null )
639+
repaint( x, 0, getWidth() - x, getHeight() );
640+
else if ( columnModel instanceof JBroTableColumnModel ) {
641+
header.repaintHeaderAndTable( x, 0, header.getWidth() - x );
642+
JBroTableHeaderUI ui = header.getUI();
643+
JBroTableColumnModel gcm = ( JBroTableColumnModel )columnModel;
644+
while ( ( column = gcm.getColumnParent( column ) ) != null )
645+
header.repaint( ui.getGroupHeaderBoundsFor( column ) );
646+
} else {
647+
repaint( x, 0, getWidth() - x, getHeight() );
648+
header.repaint();
649+
}
650+
}
651+
584652
/**
585653
* If this table is just a fixed (non-scrollable) part then this method would return main part.
586654
* @return main table for a fixed one, otherwise null

src/org/quinto/swing/table/view/JBroTableColumnModel.java

Lines changed: 37 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
package org.quinto.swing.table.view;
22

3-
import java.awt.Container;
4-
import java.awt.Dimension;
53
import java.beans.PropertyChangeEvent;
64
import java.util.ArrayDeque;
75
import java.util.ArrayList;
@@ -14,9 +12,9 @@
1412
import java.util.List;
1513
import java.util.Map;
1614
import java.util.Set;
17-
import javax.swing.JScrollPane;
1815
import javax.swing.JTable;
1916
import javax.swing.ListSelectionModel;
17+
import javax.swing.event.ChangeEvent;
2018
import javax.swing.event.TableColumnModelListener;
2119
import javax.swing.table.DefaultTableColumnModel;
2220
import javax.swing.table.TableColumn;
@@ -57,42 +55,11 @@ public void propertyChange( PropertyChangeEvent e ) {
5755
if ( ( ( Integer )e.getNewValue() ).intValue() == ( Integer )e.getOldValue() )
5856
return;
5957
totalColumnWidth = -1;
60-
JBroTableColumn column = ( JBroTableColumn )e.getSource();
61-
Enumeration< TableColumn > cols = getColumns();
62-
int x = 0;
63-
while ( cols.hasMoreElements() ) {
64-
TableColumn col = cols.nextElement();
65-
if ( col == column )
66-
break;
67-
x += col.getWidth();
68-
}
69-
JBroTableHeader header = table.getTableHeader();
70-
if ( table.isEditing() && !table.getCellEditor().stopCellEditing() )
71-
table.getCellEditor().cancelCellEditing();
72-
Container parent = table.getParent() == null ? null : table.getParent().getParent();
73-
if ( table.getAutoResizeMode() == JTable.AUTO_RESIZE_OFF && header != null && header.getResizingColumn() == column && ( parent == null || parent instanceof JScrollPane ) ) {
74-
if ( column.getPreferredWidth() != column.getWidth() ) {
75-
Dimension size = table.getPreferredSize();
76-
int oldW = column.getPreferredWidth();
77-
column.setPreferredWidth( column.getWidth() );
78-
int newW = column.getPreferredWidth();
79-
size.width += newW - oldW;
80-
table.setPreferredSize( size );
81-
if ( parent != null ) {
82-
JScrollPane scrollPane = ( JScrollPane )parent;
83-
scrollPane.getHorizontalScrollBar().getModel().setMaximum( size.width );
84-
}
85-
}
86-
} else
87-
table.revalidate();
88-
if ( header == null )
89-
table.repaint( x, 0, table.getWidth() - x, table.getHeight() );
90-
else {
91-
JBroTableHeaderUI ui = header.getUI();
92-
header.repaintHeaderAndTable( x, 0, header.getWidth() - x );
93-
while ( ( column = getColumnParent( column ) ) != null )
94-
header.repaint( ui.getGroupHeaderBoundsFor( column ) );
95-
}
58+
Object listeners[] = listenerList.getListenerList();
59+
WidthChangeEvent changeEvent = new WidthChangeEvent( this, ( JBroTableColumn )e.getSource(), ( Integer )e.getOldValue(), ( Integer )e.getNewValue(), "preferredWidth".equals( name ) );
60+
for ( int i = listeners.length - 2; i >= 0; i -= 2 )
61+
if ( listeners[ i ] == TableColumnModelListener.class )
62+
( ( TableColumnModelListener )listeners[ i + 1 ] ).columnMarginChanged( changeEvent );
9663
} else
9764
super.propertyChange( e );
9865
}
@@ -409,6 +376,37 @@ public TableColumnModel getDelegate( int level ) {
409376
return delegates.get( level );
410377
}
411378

379+
public static class WidthChangeEvent extends ChangeEvent {
380+
private final JBroTableColumn column;
381+
private final int oldWidth;
382+
private final int newWidth;
383+
private final boolean preferred;
384+
385+
public WidthChangeEvent( Object source, JBroTableColumn column, int oldWidth, int newWidth, boolean preferred ) {
386+
super( source );
387+
this.column = column;
388+
this.oldWidth = oldWidth;
389+
this.newWidth = newWidth;
390+
this.preferred = preferred;
391+
}
392+
393+
public JBroTableColumn getColumn() {
394+
return column;
395+
}
396+
397+
public int getOldWidth() {
398+
return oldWidth;
399+
}
400+
401+
public int getNewWidth() {
402+
return newWidth;
403+
}
404+
405+
public boolean isPreferred() {
406+
return preferred;
407+
}
408+
}
409+
412410
private class DelegateColumnModel implements TableColumnModel {
413411
private final int level;
414412

src/org/quinto/swing/table/view/JBroTableHeader.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,12 @@ public JBroTable getTable() {
185185
@Override
186186
public void columnMoved( TableColumnModelEvent e ) {
187187
}
188+
189+
@Override
190+
public void columnMarginChanged( ChangeEvent e ) {
191+
if ( !( e instanceof JBroTableColumnModel.WidthChangeEvent ) )
192+
super.columnMarginChanged( e );
193+
}
188194

189195
private class DelegateHeader extends JTableHeader {
190196
private final int level;

0 commit comments

Comments
 (0)