Swing JFC Java

import java.awt.Component;
import java.awt.Dimension;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.table.DefaultTableColumnModel;
import javax.swing.table.TableColumn;
import javax.swing.table.TableColumnModel;
public class FrozenColumnHeader extends JScrollPane {
  protected JTable mainTable;
  protected JTable headerTable;
  protected int columnCount;
  public FrozenColumnHeader(JTable table, int columns) {
    super();
    mainTable = table;
    headerTable = new JTable(mainTable.getModel());
    getViewport().setView(headerTable);
    columnCount = columns;
  }
  public void addNotify() {
    TableColumn column;
    super.addNotify();
    TableColumnModel mainModel = mainTable.getColumnModel();
    TableColumnModel headerModel = new DefaultTableColumnModel();
    int frozenWidth = 0;
    for (int i = 0; i < columnCount; i++) {
      column = mainModel.getColumn(0);
      mainModel.removeColumn(column);
      headerModel.addColumn(column);
      frozenWidth += column.getPreferredWidth() + headerModel.getColumnMargin();
    }
    headerTable.setColumnModel(headerModel);
    Component columnHeader = getColumnHeader().getView();
    getColumnHeader().setView(null);
    JScrollPane mainScrollPane = (JScrollPane) SwingUtilities.getAncestorOfClass(JScrollPane.class, mainTable);
    mainScrollPane.setCorner(JScrollPane.UPPER_LEFT_CORNER, new JLabel("..."));
    
    headerTable.setPreferredScrollableViewportSize(new Dimension(frozenWidth, 0));
  }
}