Ajuda JTable Customizada

Amigos,

Sou iniciante em java e estou quebrando a cabeça em como utilizar a JTable customizada, evitando assim o modo defualt. Estou utilizando Netbeans, fazendo uso do recurso que facilita a construção dos formulários.

O que pretendo fazer é elaborar uma classe que cria esse Modelo Abstrato de Tabela e inclui-la dentro do formulário, mas não estou conseguindo.

Criei um formulário chamado FormPrincipal.java, que possui o seguinte código:


package novoprojeto;

public class FormPrincipal extends javax.swing.JFrame {
    
    MinhaTabela mt;
    
    public FormPrincipal() {
        initComponents();
    }
    
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        jPanel1 = new javax.swing.JPanel();
        jButton1 = new javax.swing.JButton();
        jButton2 = new javax.swing.JButton();
        jPanel2 = new javax.swing.JPanel();
        jScrollPane2 = new javax.swing.JScrollPane(mt.createJTable());

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        jButton1.setText("Incluir");

        jButton2.setText("Excluir");

        javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
        jPanel1.setLayout(jPanel1Layout);
        jPanel1Layout.setHorizontalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jButton1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
            .addComponent(jButton2, javax.swing.GroupLayout.DEFAULT_SIZE, 100, Short.MAX_VALUE)
        );
        jPanel1Layout.setVerticalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addGap(29, 29, 29)
                .addComponent(jButton1, javax.swing.GroupLayout.PREFERRED_SIZE, 69, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addComponent(jButton2, javax.swing.GroupLayout.PREFERRED_SIZE, 69, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(50, 50, 50))
        );

        javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2);
        jPanel2.setLayout(jPanel2Layout);
        jPanel2Layout.setHorizontalGroup(
            jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel2Layout.createSequentialGroup()
                .addGap(20, 20, 20)
                .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 431, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(25, Short.MAX_VALUE))
        );
        jPanel2Layout.setVerticalGroup(
            jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel2Layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 245, Short.MAX_VALUE)
                .addContainerGap())
        );

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(18, 18, 18)
                .addComponent(jPanel2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(29, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jPanel2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(22, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>                        

    // Variables declaration - do not modify                     
    private javax.swing.JButton jButton1;
    private javax.swing.JButton jButton2;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JPanel jPanel2;
    private javax.swing.JScrollPane jScrollPane2;
    // End of variables declaration                   
}

O código da JTable, que fiz com base em alguns código que achei aqui no próprio forum:



package novoprojeto;

import java.util.ArrayList;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;

public class MinhaTabela extends AbstractTableModel {
       
    private ArrayList<Carro> linhas;
    private static final String[] colunas = { "Marca", "Modelo", "Placa", "Ano" };
    
    // Construtor da classe recebe os dados a ser populado 
        public MinhaTabela(ArrayList dados) {
        linhas = new ArrayList<Carro>(dados);
        fireTableStructureChanged();
    }
    
    // Método sobrescrito que retorna o número de linhas do JTable, após populado  
    @Override
    public int getRowCount() {
        return linhas.size();
    }
    
    // Método sobrescrito que retorna o número de colunas do JTable após populado  
    @Override
    public int getColumnCount() {
        return colunas.length;
    }
    
    // Método sobrescrito que vai popular e retornar cada célula do JTable
    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
            Carro c = linhas.get(rowIndex);
            Object row = null;
            switch(columnIndex){
                case 0: row = c.getMarca();
                break;
                case 1: row = c.getModelo();
                break;
                case 2: row = c.getPlaca();
                break;
                case 3: row = c.getAno();
                break;
            }
           return row;
    }
          /* Este método sobrescrito, permite voce editar o JTable, caso o método anterior 
          tenha algumas colunas de algumas ou todas linhas editáveis setadas para true, 
          ou que tenha como retorno o valor true para todas as linhas e colunas. */  
        public void setValueAt(Object value, int rowIndex, int columnIndex){
            Carro c = linhas.get(rowIndex);
            switch(columnIndex){
                case 0: c.setMarca((String)value);
                break;
                case 1: c.setModelo((String)value);
                break;
                case 2: c.setPlaca((String)value);
                break;
                case 3: c.setAno((Integer)value);
                break;
            }
        }
        
    /* Este método sobrescrito vai definir o nome das colunas 
    que foi atribuído na constante "col" logo no início da classe */  
    public String getColumnName(int column){
        return colunas[column];
    }
    
    /* Este método criado por nós, vai retornar o conjunto 
    de dados inteiro do JTable, através de um List contendo 
    Objetos ClienteBean populados. */ 
    public ArrayList<Carro> getLinhas() {
        return linhas;
    }
     

    /*Criar a JTable*/
    
    public JTable createJTable(){
        
    ArrayList dados = new ArrayList();   
    //Carro c = new Carro();
    //dados.add(c);
    JTable tabela = new JTable();
    tabela.setModel(new MinhaTabela(new ArrayList<Carro>()));
    MinhaTabela modelo = (MinhaTabela)tabela.getModel();
 
    return tabela;
        
    }
    
    
    
}

Como incluo essa JTable que criei nesse formulário?