Skip to content

Commit 319911c

Browse files
committed
Bug fix: creation of a table with null data was leading to improper initialization.
1 parent bcda2ea commit 319911c

File tree

2 files changed

+49
-34
lines changed

2 files changed

+49
-34
lines changed

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

Lines changed: 43 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@
2525
import javax.swing.event.TableColumnModelEvent;
2626
import javax.swing.event.TableColumnModelListener;
2727
import javax.swing.event.TableModelEvent;
28-
import javax.swing.event.TableModelListener;
2928
import javax.swing.plaf.TableHeaderUI;
3029
import javax.swing.plaf.TableUI;
3130
import javax.swing.table.JTableHeader;
@@ -46,6 +45,12 @@ public class JBroTable extends JTable {
4645
private HeaderHeightWatcher headerHeightWatcher;
4746
private Integer currentLevel;
4847
private JScrollPane scrollPane;
48+
/**
49+
* This field points to a main table for a fixed table
50+
* (fixed table is just a non-scrollable part of the main table).
51+
* This field is null for a regular table.
52+
*/
53+
private JBroTable masterTable;
4954

5055
public JBroTable() {
5156
this( null );
@@ -164,25 +169,20 @@ public void updateHeaderSize() {
164169
header.setPreferredSize( new Dimension( cmodel.getTotalColumnWidth(), h ) );
165170
}
166171

167-
protected boolean isFixed() {
168-
return false;
169-
}
170-
171172
private void checkFieldWidths() {
172173
ModelData data = getData();
173-
if ( data == null ) {
174+
if ( data == null )
174175
return;
175-
}
176176
ModelField fields[] = data.getFields();
177-
if ( fields == null ) {
177+
if ( fields == null )
178178
return;
179-
}
180179
boolean changed = false;
180+
boolean tableIsJustAFixedPart = getMasterTable() != null;
181181
for ( int i = columnModel.getColumnCount() - 1; i >= 0; i-- ) {
182182
TableColumn column = columnModel.getColumn( i );
183183
int modelIndex = column.getModelIndex();
184184
ModelField field = fields[ modelIndex ];
185-
if ( field.isVisible() && field.isFixed() == isFixed() ) {
185+
if ( field.isVisible() && field.isFixed() == tableIsJustAFixedPart ) {
186186
String headerValue = field.getCaption();
187187
if ( !Utils.equals( headerValue, column.getHeaderValue() ) ) {
188188
column.setHeaderValue( headerValue );
@@ -201,11 +201,8 @@ private void checkFieldWidths() {
201201
removeColumn( column );
202202
}
203203
}
204-
if ( changed ) {
205-
updateScrollPane();
206-
if ( getTableHeader() != null )
207-
getTableHeader().repaint();
208-
}
204+
if ( changed )
205+
tableStructureChanged();
209206
}
210207

211208
/**
@@ -595,7 +592,7 @@ public JScrollPane getScrollPane() {
595592
if ( scrollPane != null )
596593
return scrollPane;
597594
scrollPane = new JScrollPane( this );
598-
if ( !isFixed() ) {
595+
if ( getMasterTable() == null ) {
599596
updateScrollPane();
600597
addPropertyChangeListener( new PropertyChangeListener() {
601598
@Override
@@ -624,11 +621,29 @@ else if ( "model".equals( property ) )
624621
public void tableChanged( TableModelEvent e ) {
625622
super.tableChanged( e );
626623
if ( e == null || e.getFirstRow() == TableModelEvent.HEADER_ROW )
627-
updateScrollPane();
624+
tableStructureChanged();
625+
}
626+
627+
private void tableStructureChanged() {
628+
updateScrollPane();
629+
JBroTableHeader header = getTableHeader();
630+
if ( header != null ) {
631+
header.updateUI();
632+
header.repaint();
633+
}
634+
}
635+
636+
protected JBroTable getMasterTable() {
637+
return masterTable;
638+
}
639+
640+
@Override
641+
public boolean hasFocus() {
642+
return masterTable == null ? super.hasFocus() : masterTable.hasFocus();
628643
}
629644

630645
private void updateScrollPane() {
631-
if ( scrollPane == null || isFixed() )
646+
if ( scrollPane == null || getMasterTable() != null )
632647
return;
633648
ModelData data = getData();
634649
boolean hasFixed = false;
@@ -647,21 +662,9 @@ private void updateScrollPane() {
647662
}
648663
return;
649664
}
650-
JBroTable fixed;
651665
if ( scrollPane.getRowHeader() == null ) {
652-
final JBroTable main = this;
653-
fixed = new JBroTable( data ) {
654-
@Override
655-
public boolean hasFocus() {
656-
return main.hasFocus();
657-
}
658-
659-
@Override
660-
protected boolean isFixed() {
661-
return true;
662-
}
663-
};
664-
fixed.setData( null );
666+
JBroTable fixed = newInstance();
667+
fixed.masterTable = this;
665668
fixed.setModel( getModel() );
666669
fixed.setSelectionModel( getSelectionModel() );
667670
fixed.setRowSorter( getRowSorter() );
@@ -723,6 +726,14 @@ public void stateChanged( ChangeEvent e ) {
723726
}
724727
}
725728

729+
/**
730+
* This method should be overridden for proper creation of fixed non-scrollable part of the table.
731+
* @return new instance of an inherited class
732+
*/
733+
protected JBroTable newInstance() {
734+
return new JBroTable();
735+
}
736+
726737
private class HeaderHeightWatcher implements TableColumnModelListener {
727738
@Override
728739
public void columnAdded( TableColumnModelEvent evt ) {

test/org/quinto/swing/table/view/TutorialFixedColumns.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import javax.swing.JFrame;
66
import javax.swing.JScrollPane;
77
import javax.swing.JTable;
8+
import javax.swing.JViewport;
89
import javax.swing.UIManager;
910
import org.quinto.swing.table.model.IModelFieldGroup;
1011
import org.quinto.swing.table.model.ModelData;
@@ -53,8 +54,11 @@ public static void main( String... args ) throws Exception {
5354
scrollPane.setPreferredSize( new Dimension( 400, 300 ) );
5455

5556
// Left fixed table.
56-
JBroTable fixed = ( JBroTable )scrollPane.getRowHeader().getView();
57-
fixed.setAutoResizeMode( JTable.AUTO_RESIZE_SUBSEQUENT_COLUMNS );
57+
JViewport viewport = scrollPane.getRowHeader();
58+
if ( viewport != null ) {
59+
JBroTable fixed = ( JBroTable )viewport.getView();
60+
fixed.setAutoResizeMode( JTable.AUTO_RESIZE_SUBSEQUENT_COLUMNS );
61+
}
5862

5963
JFrame frame = new JFrame( "Test" );
6064
frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );

0 commit comments

Comments
 (0)