Make a (get) component without pack()

Hello

I'm trying to implement Re: JTable column header to span several columns for a covering table header. In this example, scrollPane header is defined AFTER the framework was achieved with pack().
In my application, however, I have several different tables that I showed a common dialog, which I pass the corresponding array containing only scrollPane. Is there a way to get the scrollPane realized before be displayed? Currently, I met a NullPointerException (to the arrow "->"). I tried doLayout() and validate() nothing helps.
import java.awt.*;
import java.util.Collections;
import java.util.Enumeration;
import java.util.List;
import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.TableColumnModelEvent;
import javax.swing.event.TableColumnModelListener;
import javax.swing.table.*;
 
public class MultiSpanHeader1 {

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {

         @Override
         public void run() {
            new MultiSpanHeader1().makeUI();
         }
      });
   }
 
   public void makeUI() {
      final JFrame frame = new JFrame("MultiSpanHeader test");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.setSize(200, 200);
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);
      MyTable myTable= new MyTable();
      JScrollPane scroll= new JScrollPane(myTable);
      JPanel panel = new JPanel(new GridLayout(2, 1));
      panel.add(myTable.dummyHeader);
      panel.add(myTable.getTableHeader());
// -->
      System.out.println(scroll.getColumnHeader()); // null
      scroll.getColumnHeader().setView(panel); // NPE
      new TableDialog(frame, scroll);
   }


   class TableDialog extends JDialog {
     public TableDialog(Frame parent, JScrollPane scroll) {
       super(parent, true);
       setLocationRelativeTo(parent);
       add(scroll);
       setVisible(true);
     }
   }


  class MyTable extends JTable {
    final JTableHeader dummyHeader;

    public MyTable() {
      super(5, 6);
      getTableHeader().setReorderingAllowed(false);
      final TableColumnModel model = getColumnModel();
      Enumeration<TableColumn> enumColumns = model.getColumns();
      final List<TableColumn> columns = Collections.list(enumColumns);
      
      final JTable dummy = new JTable(0, 3);
      dummyHeader= dummy.getTableHeader();
      dummyHeader.setReorderingAllowed(false);
      dummyHeader.setResizingAllowed(false);
      final TableColumnModel dummyModel = dummy.getColumnModel();
      Enumeration<TableColumn> enumDummyColumns = dummyModel.getColumns();
      final List<TableColumn> dummyColumns = Collections.list(enumDummyColumns);
      
      model.addColumnModelListener(new TableColumnModelListener() {
         @Override
         public void columnAdded(TableColumnModelEvent e) {
         }
 
         @Override
         public void columnRemoved(TableColumnModelEvent e) {
         }
 
         @Override
         public void columnMoved(TableColumnModelEvent e) {
         }
 
         @Override
         public void columnMarginChanged(ChangeEvent e) {
            dummyColumns.get(0).setWidth(columns.get(0).getWidth());
            dummyColumns.get(1).setWidth(columns.get(1).getWidth() +
                  columns.get(2).getWidth());
            dummyColumns.get(2).setWidth(columns.get(3).getWidth() +
                  columns.get(4).getWidth() + columns.get(5).getWidth());
         }
 
         @Override
         public void columnSelectionChanged(ListSelectionEvent e) {
         }
      });
    }
  }

}

You will need to substitute JTable #configureEnclosingScrollPane () to do nothing and use get #setColumnHeaderView what auto creates the window:

import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTable;

public class TestTable5 {
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                JTable table = new JTable(5, 5) {
                    @Override
                    protected void configureEnclosingScrollPane() {
                        // do nothing, custom table header
                    }
                };
                JScrollPane pane = new JScrollPane(table);
                pane.setColumnHeaderView(new JLabel("Hi!"));
                JFrame frame = new JFrame("Test");
                frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                frame.getContentPane().add(pane);
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }
}

Tags: Java

Similar Questions

Maybe you are looking for

  • How recover Equium L40-10 X?

    Hello I'm trying to reboot my computer to factory settings do not know how to do this I need a floppy or there at - it something built into the laptop. Any help much appreciated. I have an Equium L40-10 X. Thank you

  • My cursor is unresponsive and sometimes beach balls.

    My cursor stops responding.  It is not Frost simply does not work and I can't scroll.  Also, sometimes I get a beachball.  Here is my information.  I have a lot of Red! EtreCheck version: 2.7.7 (237) Report generated 2016-01-24 15:49:52 Download Etre

  • change suddenly in the Task Manager

    All of a sudden (nothing has been installed), changed the Task Manager window.  It can now be minimized and right-click on its process in the bar tasks generates no response.  I can still close by closing all windows, but if I open any other applicat

  • Want to copy and paste the names of files only, not the content

    I have organized hundreds of files in several folders of dozens and that you must first create a list or map of all files.  I want only the names of files, not other thing.  I found some freeware that seems designed to do this, but am reluctant to do

  • Windows 7 does not connect to Time Capsule

    I have 2 computers connected to Apple's Time Capsule.  I have the HP laptop with Windows Vista Home Premium SP1 with all updates trendy top of x 64 and it is able to connect to the Wi - Fi router part and connect to the part of the external hard driv