Duvida sobre jtable

Boa tarde , então eu estou com a seguinte duvida eu queria saber se é possível salvar uma classe completa direto de jtable
não sei , se estou me expressando bem mais vamos la eu tenho um cadastro de receitas e na mesma tela um jtable pros
ingredientes, eu add um botão na lateral pra adicionar ou remover ingredientes do jtable e ao mesmo tempo ele remove ou add
na collection ingredientes da receita, bem eu estive pesquisando vendo sobre as tablemodel mais a maioria ja pede uma list de inicio,
sou iniciante mais gostaria de saber como fazer isso , com tablemodel pois com a default ja consigui mais quero ver se melhoro vlw e obrigado.

Bem galera não sei se fiz a pergunta intão vó mostra oque eu quero tentar fazer:
Tipo com DefaultTableModel eu faço:

Fuçao botao para criar uma nova linha:
Na jatable

dtmingredientes.addRow(new Object[]{null, null, null, null, null, null, null, null, null});

funcao que remove linhas

[code] private void remove_linhas() {
// TODO add your handling code here:
int linha = tblRegistros.getSelectedRow();
if (linha > -1) {
dtmingredientes.removeRow(linha);

    } else {
        if ((dtmingredientes.getRowCount() - 1) >= 0) {
            dtmingredientes.removeRow(dtmingredientes.getRowCount() - 1);

        } else {
            JOptionPane.showMessageDialog(this, "Nao tem mais linhas.");
        }

    }
}[/code]

Dai eu tenho vários métodos.

[code]public double somar() {
double soma = 0;
for (int i = 0; i < tblRegistros.getRowCount(); i++) {

        Double valor = Double.parseDouble(String.valueOf(Tratamento_String(i)));
        soma += valor.doubleValue();
    }


    return soma;
}

public double cmv_porcao() {

    double teste;
    teste = somar() / Double.parseDouble(trat_campos(jtf_rend_quan.getText()));

    return teste;

}

private String Tratamento_String(int i) {
String trat = String.valueOf(tblRegistros.getValueAt(i, 9));
trat = trat.replaceAll(",", “.”);
return trat;
}

private double cmv_evento() {
double total_evento;
Double n_partici = Double.parseDouble(trat_campos(jTextField7.getText()));
total_evento = cmv_porcao() * n_partici;

    return total_evento;
}

private double venda_evento() {
double total_venda = 0;
total_venda = (Double.parseDouble(trat_campos(jTextField7.getText()))) * preco_venda();

    return total_venda;
}

private double lucro_pretendido() {
double margem_lucro;

    margem_lucro = cmv_porcao() * (Double.parseDouble(trat_campos(jtf_lucro_pretendido.getText()))) / 100;

    return margem_lucro;

}

private double preco_venda() {
    double preco_venda;

    preco_venda = cmv_porcao() + lucro_pretendido();
    return preco_venda;
}

private void quanti_bruta_table(){
    double rendimento;
    double quantidade_liquida;
    double quantidade_bruta;
    
    for (int i = 0; i < tblRegistros.getRowCount(); i++) {
    rendimento=Double.parseDouble(String.valueOf(tblRegistros.getValueAt(i, 4)));
    quantidade_liquida=Double.parseDouble(String.valueOf(tblRegistros.getValueAt(i, 2)));
    quantidade_bruta=(quantidade_liquida*100)/rendimento;
    Object oi;
    DecimalFormat df = new DecimalFormat("0.00");
    String pass = df.format(quantidade_bruta);
    oi=pass;
    tblRegistros.setValueAt(oi, i, 6);
    }
    
}

private void quanti_compra_table(){
    double rendimento;
    double quantidade_liquida;
    double numpart;
    double quantidade_bruta;
    
    for (int i = 0; i < tblRegistros.getRowCount(); i++) {
    rendimento=Double.parseDouble(String.valueOf(tblRegistros.getValueAt(i, 4)));
    quantidade_liquida=Double.parseDouble(String.valueOf(tblRegistros.getValueAt(i, 2)));
    numpart= Double.parseDouble(jTextField7.getText());
    quantidade_bruta=(quantidade_liquida*100)/rendimento*numpart;
    Object oi;
    DecimalFormat df = new DecimalFormat("0.00");
    String pass = df.format(quantidade_bruta);
    oi=pass;
    tblRegistros.setValueAt(oi, i, 7);
    }
    
}

private String trat_campos(String tes) {
String trat = tes.replace(‘R’, ’ ‘);
trat = trat.replace(’$’, ’ ‘);
trat = trat.replace(’:’, ’ ');
trat = trat.replaceAll(" ", “”);
return trat;
}

private double lucro_bruto_Evento() {
    double lucro_bruto_evento;
    lucro_bruto_evento = venda_evento() - cmv_evento();

    return lucro_bruto_evento;
}[/code]

Intao agora eu usei tudo com defaultTablemodel eu queria criar um tablemodel próprio minha duvida é en questao os
cálculos que usam campo sen ser do jtable como faria e também minha primeira duvida

pois quando eu clico numa nova linha eu chamo um método que com os valores do jtable ele preenche meu objeto ingrediente e salva na colection e save usando o hibernate
tipo é ± assim

[code]Ficha f1= new Ficha();
Ingrediente in= new Ingrediente();
f1.setIngredientes(new ArrayList());

    f1.getIngredientes().add(in);
    hiber.insert(in);
   [/code]

Galera já comecei com um exemplo que achei no fórum:

[code]public class IngredienteTableModel extends AbstractTableModel {

//Primeiro criamos constantes, para nossas colunas  
private static final int COD = 0;
private static final int Descricao_Ingrediente = 1;
private static final int Qtdade_Liquida = 2;
private static final int Unidade = 3;
private static final int Rendimento = 4;
private static final int Embalagem = 5;
private static final int Qtdade_Bruta = 6;
private static final int Qtde_Compra = 7;
private static final int Preco_Unitario = 8;
private static final int Preco_Bruto = 9;
private List<Ingrediente> valores;   //A lista de ingredientes que pretendemos exibir  

public IngredienteTableModel() {
}

private Test_ficha test;

//Esse é um construtor, que recebe a nossa lista ingredientes 
public IngredienteTableModel(Collection<Ingrediente> valores) {
    this.valores = new ArrayList<Ingrediente>(valores);
}

public int getRowCount() {
    //Quantas linhas tem sua tabela? Uma para cada item da lista.  
    return valores.size();
}

public int getColumnCount() {
    //Quantas colunas tem a tabela? Na sua tabela, 5.  
    return 10;
}

public String getColumnName(int columnIndex) {
    //Qual é o nome das nossas colunas? Isso aparecerá no cabeçalho  
    if (columnIndex == COD) {
        return "Código";
    }
    if (columnIndex == Descricao_Ingrediente) {
        return "Descrição";
    }
    if (columnIndex == Qtdade_Liquida) {
        return "Qtdade Liquida";
    }
    if (columnIndex == Unidade) {
        return "Unidade";
    }
    if (columnIndex == Rendimento) {
        return "Rendimento";
    }
    if (columnIndex == Embalagem) {
        return "Embalagem";
    }
    if (columnIndex == Qtdade_Bruta) {
        return "Qtdade_Bruta";
    }
    if (columnIndex == Qtde_Compra) {
        return "Qtdade_Compra";
    }
    if (columnIndex == Preco_Unitario) {
        return "Preco Unitario";
    }
    if (columnIndex == Preco_Bruto) {
        return "Preco Bruto";
    }
    throw new IllegalArgumentException("Invalid column:" + columnIndex);
}

public Object getValueAt(int row, int column) {
    //Precisamos retornar o valor da coluna column e da linha row.  
    //O JTable chama esse método quando precisa desenhar uma célula. E só ele deve chama-lo.  
    //Você usará um método muito mais conveniente, chamado getProduto()  
    Ingrediente in = valores.get(row);
    if (column == COD) {
        return in.getCod_ingrediente();
    }
    if (column == Descricao_Ingrediente) {
        return in.getDescricao_ingrediente(); //A descrição é só o nome mesmo?  
    }
    if (column == Qtdade_Liquida) {
        return in.getQuat_liquida();
    }
    if (column == Unidade) {
        return in.getTipo_unidade();
    }
    if (column == Rendimento) {
        return in.getRendimento();
    }
    if (column == Embalagem) {
        return in.getEmbalagem();
    }
    if (column == Qtdade_Bruta) {
        double qtb;
        qtb=(in.getQuat_liquida()*100)/in.getRendimento();
        in.setQuanti_bruta(qtb);
        return in.getQuanti_bruta();
    }
    if (column == Qtde_Compra) {
  
        return in.getQuanti_compra();
    }
    if (column == Preco_Unitario) {
        return in.getPreco_uni();
    }
    if (column == Preco_Bruto) {
        return in.getPreco_bru();
    }
    throw new IllegalArgumentException("Invalid column:" + column);
}

//Você deve implementar o setValueAt se sua tabela for editável.  
//Nesse exemplo, vou deixar alterar só a quantidade.  
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
    try {
        if (columnIndex == Rendimento) {
            valores.get(rowIndex).setRendimento(Integer.parseInt(aValue.toString()));
        }
    } catch (Exception e) {
        //Em caso de exceção, deixo o produto inalterado. Isso fará com que os valores antigos sejam desenhados.  
        //Pode ocorrer caso o usuário digite uma letra na quantidade, por exemplo.  
    }
}

public Class getColumnClass(int columnIndex) {
    //Qual a classe das nossas colunas?   
    if (columnIndex == COD) {
        return Long.class;
    }
    if (columnIndex == Descricao_Ingrediente) {
        return String.class;
    }

// if (columnIndex == Qtdade_Liquida) {
// return double.class
// }
if (columnIndex == Unidade) {
return String.class;
}
if (columnIndex == Rendimento) {
return int.class;
}
// if (columnIndex == Embalagem) {
// return double.class;
// }
// if (columnIndex == Qtdade_Bruta) {
// return double.class
// }
// if (columnIndex == Qtde_Compra) {
// return double.class
// }
// if (columnIndex == Preco_Unitario) {
// return double.class
// }
// if (columnIndex == Preco_Bruto) {
// return double.class
// }
//
//As demais são double
return Double.class;
}

public boolean isCellEditable(int rowIndex, int columnIndex) {
    //Indicamos se a célula da rowIndex e da columnIndex é editável. Somente a quantidade é editavel nesse exemplo  
    return columnIndex == Rendimento;

}
//Já que esse tableModel é de produtos, vamos fazer um get que retorne um produto inteiro.  
//Isso elimina a necessidade de chamar o getValueAt() nas telas.   

public Ingrediente get(int row) {
    return valores.get(row);
}

// --- Já respondemos ao Swing o que ele queria saber. Agora é hora de adicionar métodos para nós mesmo. :)   
//Esse método permite adicionar um produto na JTable  
public void add(Ingrediente ingrediente) {
    //Adicionamos o produto  
    valores.add(ingrediente);
    //Avisamos a table, para que redesenhe a linha  
    fireTableRowsInserted(valores.size() - 1, valores.size() - 1);
}

public List<Ingrediente> getIngredientes() {
    return Collections.unmodifiableList(valores);
}

}
[/code]

E agora meu problema como farei para mais campos editáveis , e como farei pra ele quando for salvar o ingrediente usar os dados do jtable???