Swing JFC Java

import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JTable;
import javax.swing.LookAndFeel;
import javax.swing.table.AbstractTableModel;
public class RowNumberHeader extends JTable {
  protected JTable mainTable;
  public RowNumberHeader(JTable table) {
    super();
    mainTable = table;
    setModel(new RowNumberTableModel());
    setPreferredScrollableViewportSize(getMinimumSize());
    setRowSelectionAllowed(false);
    JComponent renderer = (JComponent) getDefaultRenderer(Object.class);
    LookAndFeel.installColorsAndFont(renderer, "TableHeader.background",
        "TableHeader.foreground", "TableHeader.font");
    LookAndFeel.installBorder(this, "TableHeader.cellBorder");
  }
  public int getRowHeight(int row) {
    return mainTable.getRowHeight();
  }
  class RowNumberTableModel extends AbstractTableModel {
    public int getRowCount() {
      return mainTable.getModel().getRowCount();
    }
    public int getColumnCount() {
      return 1;
    }
    public Object getValueAt(int row, int column) {
      return new Integer(row + 1);
    }
  }
  public static void main(String[] a) {
    JFrame f = new JFrame();
    f.add(new RowNumberHeader(new JTable(3, 4)));
    f.setSize(300, 300);
    f.setVisible(true);
  }
}