2525import javax .swing .event .TableColumnModelEvent ;
2626import javax .swing .event .TableColumnModelListener ;
2727import javax .swing .event .TableModelEvent ;
28- import javax .swing .event .TableModelListener ;
2928import javax .swing .plaf .TableHeaderUI ;
3029import javax .swing .plaf .TableUI ;
3130import 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 ) {
0 commit comments