Problemas com edição da TableModel com ComboBox e outras colunas

Pessoal

Tou com problemas em relação a minha TableModel jTFases que são as fases de execução do serviço. Ainda não consigo entender bem a AbstractTableModel.

Tenho uma Interface Grafica com varios paineis e uma JTable que pretendo inserir, editar e excluir linha com combobox, datas e codigos.
As minhas duvidas:

  1. Na minha tabela existe 10 colunas, sendo editavel da quarta coluna em diante. Quando insiro um registro padrão como mostrado no anexo, edito a quarta coluna que é um combo e ela me traz os registros da tabela relacionada bonitinho. Só que quando seleciono o registro e dou enter para a proxima coluna, ele coloca outra descrição como se estivesse sobreescrevendo algo, e não passa para proxima coluna quando dou enter, e a descrição do combo selecionada passa para o proxima coluna da tabela causando esta excessão.
    Exception in thread “AWT-EventQueue-0” java.lang.NumberFormatException: For input string: "APLICACAO CERAMICA"
    at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65). Como tratar esse caso?

2)Como faço para alterar o codigo ou Id. da descrição do combo quando selecionar o registro?

3)Quando seleciono o registro da Tabela ele não está deixando entrar na celula para fazer a selecão e alteração do registro. Parece q está fora de foco. Como faço para editar da quarta até a 9 coluna?

4)Quando acesso a tela da Tabela parece que ela esta fora de foco, não consigo edita-la. Existe um botão de Dados que o seu objetivo é dar um refresh, selecionar a primeira linha da tabela e editar alguma celula para fazer as alterações, mas não estou conseguindo fazer isso? Alguem poderia me explicar como usar os metodos da AbstractModel para resolver esse problema?

5)Selecionar e Excluir uma linha da tabela?
Estou postando o codigo da classe, editor da tablemodel, tablemodel e os botões das chamadas.

package modelo;

import java.util.Date;

/**
 *
 * @author Octacilio - Classe Fase de Execução
 */
public class FaseExecucao {    
  private Integer idos;
  private Integer idficha;
  private Integer id;
  private Integer idfase;
  private String nomefase;
  private Date recepcao;
  private Date emissao;
  private String pessoaConsultorio;
  private Integer idsetor;
  private String nomesetor;
  private boolean pronta;
  private Fase fase;
  private Setor setor;

    @Override
    public String toString() {
        return "FaseExecucao{" + "idfase=" + idfase + ","
               + " nomefase=" + nomefase + ", recepcao=" + recepcao + ","
               + " emissao=" + emissao + ", idsetor=" + idsetor + ", "
               + "nomesetor=" + nomesetor + ", fase=" + fase + ", setor=" + setor + '}';
    }

    public Setor getSetor() {
        return setor;
    }

    public void setSetor(Setor setor) {
        this.setor = setor;
    }

    public Fase getFase() {
        return fase;
    }

    public void setFase(Fase fase) {
        this.fase = fase;
    }

    public boolean isPronta() {
        return pronta;
    }

    public void setPronta(boolean pronta) {
        this.pronta = pronta;
    }

    public Integer getIdsetor() {
        return idsetor;
    }

    public void setIdsetor(Integer idsetor) {
        this.idsetor = idsetor;
    }

    public String getNomesetor() {
        return nomesetor;
    }

    public void setNomesetor(String nomesetor) {
        this.nomesetor = nomesetor;
    }

    public Date getEmissao() {
        return emissao;
    }

    public void setEmissao(Date emissao) {
        this.emissao = emissao;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public Integer getIdfase() {
        return idfase;
    }

    public void setIdfase(Integer idfase) {
        this.idfase = idfase;
    }

    public Integer getIdficha() {
        return idficha;
    }

    public void setIdficha(Integer idficha) {
        this.idficha = idficha;
    }

    public Integer getIdos() {
        return idos;
    }

    public void setIdos(Integer idos) {
        this.idos = idos;
    }

    public String getNomefase() {
        return nomefase;
    }

    public void setNomefase(String nomefase) {
        this.nomefase = nomefase;
    }

    public String getPessoaConsultorio() {
        return pessoaConsultorio;
    }

    public void setPessoaConsultorio(String pessoaConsultorio) {
        this.pessoaConsultorio = pessoaConsultorio;
    }

    public Date getRecepcao() {
        return recepcao;
    }

    public void setRecepcao(Date recepcao) {
        this.recepcao = recepcao;
    }

    public void setFase(String descricao) {
        this.nomefase = nomefase;
    }

    public void setSetor(String nome) {
        this.nomesetor = nomesetor;
    }

}

//Botões de chamadas
    private void jBPesquisarFasesActionPerformed(java.awt.event.ActionEvent evt) {                                                 
        // TODO add your handling code here:
//        limpaCamposFasesOsFichas();
         setaFaseExecucao();
         jTFases.setSurrendersFocusOnKeystroke(true); 
         jTFases.requestFocus();
//         table.getSelectionModel().setSelectionInterval(linhaInicial, linhaFinal); 
         jTFases.getSelectionModel().setSelectionInterval(0, 0); // está selecionando a primeira linha da tabela
    }                                

    private void jBAlterarFasesActionPerformed(java.awt.event.ActionEvent evt) {                                               
      // TODO add your handling code here:
       incluir = false;
        checaCamposFasesOsFicha();
        if (!check_OK) {
            return;
        }
        Dao<FaseExecucao> dao = null;
        try {
            editaCamposFasesOsFichas();
            dao = new FaseExecucaoDao();
 //           fase.setId(Integer.parseInt(txtIdFaseExecucao.getText()));
            dao.update(fase);
            JOptionPane.showMessageDialog(null, "Fase de Execução ALTERADA com sucesso!");
        } catch (SQLException ex) {
            Logger.getLogger(jFOs.class.getName()).log(Level.SEVERE, null, ex);
        }
        try {
            dao.closeConnection();
        } catch (SQLException ex) {
            Logger.getLogger(jFOs.class.getName()).log(Level.SEVERE, null, ex);
        }
    }                                

//TableModel JTFases

package TableModels;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.table.AbstractTableModel;
import modelo.Fase;
import modelo.FaseExecucao;
import modelo.Setor;
import util.ConvData;

/**
 *
 * @author Octacilio
 */
public class FaseExecucaoTableModel extends AbstractTableModel {

  
    private static final long serialVersionUID = 1L;
    ConvData convdata = new ConvData();
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");       
    /* Lista de FaseExecucao que representam as linhas. */  
    private List<FaseExecucao> linhas; 
  
    /* Array de Strings com o nome das colunas. */  
    private String[] colunas = new String[]{  
    "Os","Ficha  ","Id.","Id.","Descrição da Fase       ","Id.","Setor                            ", "Recepção  ","  Emissão  ","Pessoa no Consultório         "};
// constantes da tableModel
    private static final int OS = 0;  
    private static final int FICHA = 1;  
    private static final int ID = 2;  
    private static final int IDFASE = 3;  
    private static final int DESCFASE = 4;  
    private static final int IDSETOR = 5;  
    private static final int DESCSETOR = 6;  
    private static final int RECEPCAO = 7;  
    private static final int EMISSAO = 8;  
    private static final int PESSOA = 9;  
    /* Cria um FaseExecucaoTableModel vazio. */  
    public FaseExecucaoTableModel() { 
//        System.out.println("passei na FaseTableModel - inicio!");

        linhas = new ArrayList<FaseExecucao>(); 
    }  
  
    /* Cria um FaseTableModel carregado com 
     * a lista de FaseExecucao especificada. */  
    public FaseExecucaoTableModel(List<FaseExecucao> faseexecucao) {  
//System.out.println("passei na FaseTableModel!");
        this.linhas = new ArrayList<FaseExecucao>(faseexecucao); 
//System.out.println("linhas=" + linhas.size());     
        
       linhas = new ArrayList<FaseExecucao>(faseexecucao);
/*             for (Fase p: linhas){
                   System.out.println("  Id. Tipopreco=" + (p.getIdtipopreco()));     
                 System.out.println(" NomeTipopreco=" + (p.getNometipopreco()));     
                   System.out.println(" Id.Protese=" + (p.getIdprotese()));     
                   System.out.println("Nome Protese=" + (p.getNomeprotese()));     
                   System.out.println(" IdOs=" + (p.getIdos()));     
                   System.out.println("Fase=" + (p.getId()));  
                   System.out.println("Prova=" + (p.getProva()));  
             }*/
    }  
  
  
    /* Retorna a quantidade de colunas. */  
    @Override  
    public int getColumnCount() {  
        // Esta retornando o tamanho do array "colunas".  
//System.out.println("tamanho da coluna=" +colunas.length);        
        return colunas.length;  
    }  
  
    /* Retorna a quantidade de linhas. */  
    @Override  
    public int getRowCount() {  
        // Retorna o tamanho da lista de Fase.  
//System.out.println("linhas=" + linhas.size());     
        return linhas.size();  
    }  
  
    /* Retorna a quantidade de linhas. */  

    @Override  
    public String getColumnName(int columnIndex) {  
        // Retorna o conteudo do Array que possui o nome das colunas 
//System.out.println("nome da coluna=" +colunas[columnIndex]); 
/*        if(columnIndex == 3){
        Fase fase = new Fase();
        return fase.getDescricao();      
//System.out.println("nome da coluna=" +colunas[columnIndex]); 
            
        }else{*/
        return colunas[columnIndex];
 //       }
    }  
  
    ;  
  
/* Retorna a classe dFaseExecucao elementFaseExecucao da coluna especificada.
	 * Este método é usado pela JTable na hora de definir o editor da célula. */
	@Override
	public Class<?> getColumnClass(int columnIndex) {
		// Retorna a classe referente a coluna especificada.
		// Aqui é feito um switch para verificar qual é a coluna
		// e retornar o tipo adequado. As colunas são as mesmas
		// que foram especificadas no array "colunas".
		switch (columnIndex) {
		case 0: // Primeira coluna é o nome, que é uma String.
			return Integer.class;
		case 1: // Primeira coluna é o nome, que é uma String.
			return Integer.class;
		case 2: // Primeira coluna é o nome, que é uma String.
			return Integer.class;
		case 3: // Segunda coluna é a fase, que também é uma String..
			return Integer.class;
		case 4: // Segunda coluna é a fase, que também é uma String..
			return Fase.class;
		case 5: // Terceira coluna é a data de cadastro,
			return Integer.class;
		case 6: // Terceira coluna é a data de cadastro,
			return Setor.class;
		case 7: // Quarta coluna é a mensalidade, um double.
			return Date.class;
		case 8: // Quarta coluna é a mensalidade, um double.
			return Date.class;
		case 9: // Quinta coluna date.
                        return String.class;
		default:
			// Se o índice da coluna não for válido, lança um
			// IndexOutOfBoundsException (Exceção de índice fora dFaseExecucao limites).
			// Não foi necessário verificar se o índice da linha é inválido,
			// pois o próprio ArrayList lança a exceção caso seja inválido.
			throw new IndexOutOfBoundsException("ERRO. Coluna fora do limite - ClassFaseExecucao!");
		}
	}
  
    ;  
  
    
  
    @Override  
    public Object getValueAt(int rowIndex, int columnIndex) {  
            FaseExecucao faseexecucao = linhas.get(rowIndex);  
//System.out.println("Passou getValueAt "+linhas.get(rowIndex));  
        // Retorna o campo referente a coluna especificada.  
        // Aqui é feito um switch para verificar qual é a coluna  
        // e retornar o campo adequado. As colunas são as mesmas  
        // que foram especificadas no array "colunas".  
        switch (columnIndex) {  
  
            // Seguindo o exemplo: "Tipo","Data de Cadastro", "Nome", "Idade"};  
            case OS:  
                return faseexecucao.getIdos();  
            case FICHA:  
                return faseexecucao.getIdficha();  
            case ID:  
                return faseexecucao.getId();  
            case IDFASE:  
//                return faseexecucao.getFase(); // não aparece nada no combo qdo clico  
//                return faseexecucao.getFase().getDescricao(); // java.lang.NullPointerException  
                return faseexecucao.getIdfase();  // o return tem q ser esse
            case DESCFASE:  
//                return faseexecucao.getFase(); // não aparece nada no combo qdo clico  
//                return faseexecucao.getFase().getDescricao(); // java.lang.NullPointerException  
                return new Fase();  // o return tem q ser esse
            case IDSETOR:  
                return faseexecucao.getIdsetor();  
            case DESCSETOR:  
                return new Setor();  
            case RECEPCAO:  
                return faseexecucao.getRecepcao();  
            case EMISSAO:  
                return faseexecucao.getEmissao();  
            case PESSOA:  
                return faseexecucao.getPessoaConsultorio();  
	    default:
                // Isto não deveria acontecer...  
                throw new IndexOutOfBoundsException("Erro - columnIndex fora de limite GetFaseExecucao!");  
        }  
    }  
  
@Override  
//modifica na linha e coluna especificada  
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {  
      FaseExecucao faseexecucao = linhas.get(rowIndex); // Carrega o item da linha que deve ser modificado  
  
     switch (columnIndex) { // Seta o valor do campo respectivo  
          case OS:  
                faseexecucao.setIdos(Integer.parseInt(aValue.toString()));  
          case FICHA:  
                faseexecucao.setIdficha(Integer.parseInt(aValue.toString()));  
          case ID:  
             faseexecucao.setId(Integer.parseInt(aValue.toString()));  
//                   System.out.println("Id.Fase de = "+(Integer.parseInt(aValue.toString())));
         case IDFASE:  
                   System.out.println("iD Fase= "+aValue);
             faseexecucao.setIdfase(Integer.parseInt(aValue.toString()));
         case DESCFASE:  // descrição da fase
                   System.out.println("Descricao Fase= "+aValue);
             faseexecucao.setNomefase(aValue.toString());
         case IDSETOR:  
                   System.out.println("iD Fase= "+aValue);
             faseexecucao.setIdsetor(Integer.parseInt(aValue.toString()));
         case DESCSETOR:  // descrição do setor
                   System.out.println("Descricao Setor= "+aValue);
             faseexecucao.setSetor(aValue.toString());
         case RECEPCAO:  
//                   System.out.println("Recepcao= "+aValue.toString());
          try {
                 System.out.println("setValue Recepcao= "+aValue);
//                faseexecucao.setRecepcao(sdf.parse(util.ConvData.formataData(aValue.toString())));
              faseexecucao.setRecepcao(util.ConvData.formatarData(aValue.toString()));
          } catch (Exception ex) {
              Logger.getLogger(FaseExecucaoTableModel.class.getName()).log(Level.SEVERE, null, ex);
          }  
         case EMISSAO:  
          try {
              faseexecucao.setEmissao(util.ConvData.formatarData(aValue.toString()));
          } catch (Exception ex) {
              Logger.getLogger(FaseExecucaoTableModel.class.getName()).log(Level.SEVERE, null, ex);
          }  
         case PESSOA:  
             faseexecucao.setPessoaConsultorio(aValue.toString());  
         default:  
             // Isto não deveria acontecer...               
     }  
     // notifica a mudança
        fireTableCellUpdated(rowIndex, columnIndex);  
     }  
  
    //modifica na linha especificada  
    public void setValueAt(FaseExecucao aValue, int rowIndex) {  
        FaseExecucao faseexecucao = linhas.get(rowIndex); // Carrega o item da linha que deve ser modificado  
  
          faseexecucao.setIdfase(aValue.getIdfase());  
          faseexecucao.setIdsetor(aValue.getIdsetor());  
          faseexecucao.setRecepcao(aValue.getRecepcao());  
          faseexecucao.setEmissao(aValue.getEmissao());  
          faseexecucao.setPessoaConsultorio(aValue.getPessoaConsultorio());  
  
          fireTableCellUpdated(rowIndex, 3);  
          fireTableCellUpdated(rowIndex, 5);  
          fireTableCellUpdated(rowIndex, 7);  
          fireTableCellUpdated(rowIndex, 8);  
          fireTableCellUpdated(rowIndex, 9);  
  
    }  
    ;  
  
  
    ;  
  
  
    @Override  
    public boolean isCellEditable(int rowIndex, int columnIndex) {  
        if (columnIndex < 3) {
            return false;
        } else {
            return true;
        }  
    }  
  
    public FaseExecucao getFaseExecucao(int indiceLinha) {  
        return linhas.get(indiceLinha);  
    }  
  
    /* Adiciona um registro. */  
    public void addFaseExecucao(FaseExecucao m) {  
        // Adiciona o registro.  
        linhas.add(m);  
  
  
        int ultimoIndice = getRowCount() - 1;  
  
        fireTableRowsInserted(ultimoIndice, ultimoIndice);  
    }  
  
    /* Remove a linha especificada. */  
    public void removeFaseExecucao(int indiceLinha) {  
        linhas.remove(indiceLinha);  
  
        fireTableRowsDeleted(indiceLinha, indiceLinha);  
    }  
  
    /* Adiciona uma lista de FaseExecucao ao final dFaseExecucao registrFaseExecucao. */  
    public void addListaDeFaseExecucao(List<FaseExecucao> faseexecucao) {  
        // Pega o tamanho antigo da tabela.  
        int tamanhoAntigo = getRowCount();  
  
        // Adiciona FaseExecucao registrFaseExecucao.  
        linhas.addAll(faseexecucao);  
  
        fireTableRowsInserted(tamanhoAntigo, getRowCount() - 1);  
    }  
  
    /* Remove todFaseExecucao FaseExecucao registrFaseExecucao. */  
    public void limpar() {  
        linhas.clear();  
        fireTableDataChanged();  
    }  
  
    /* Verifica se este table model esta vazio. */  
    public boolean isEmpty() {  
        return linhas.isEmpty();  
    }
    public void setVisible(boolean b) {
        
    }

}

//Editor da celula de Tabela relacionada de Fase
package Classes;

import dao.FaseDao;
import fontes.Cadastros.jIFOs;
import java.awt.Component;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.AbstractCellEditor;
import javax.swing.JComboBox;
import javax.swing.JTable;
import javax.swing.table.TableCellEditor;
import modelo.Fase;

  
    //Ao final da edição o valor retornado para o TableModel vem desta função.  
/**
 *
 * @author OCTACILIO
 */
public class FaseComboEditor extends AbstractCellEditor implements TableCellEditor{

    Fase f = new Fase();
    private ArrayList<Fase> listaFase = new ArrayList<Fase>();

    private JComboBox field;  
    private Fase[] values = {};  
    //Ao editar a célula este método cria um jComboBox  
    @Override
    public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
         System.out.println("passou FaseComboEditor "); 
         removeCellEditorListener(table);
         //Defino os valores para o comboBox  
        field = new JComboBox(values);  
        field.addItem("");
        field.removeAll();
        // popula o combo fase
        FaseDao dao = null;
        try {
            dao = new FaseDao();
        //Aqui usando Generics porque o metodo retorna um ArrayList de object's e preciso acessar os metodos do bean  
            listaFase = (ArrayList<Fase>) dao.listAll();
        } catch (SQLException ex) {
            Logger.getLogger(jIFOs.class.getName()).log(Level.SEVERE, null, ex);
        }
        try {
            dao.closeConnection();
        } catch (SQLException ex) {
            Logger.getLogger(jIFOs.class.getName()).log(Level.SEVERE, null, ex);
        }   
       //O método addItem adiciona objetos ao model do ComboBox  
       //Esse getNome do objeto c retorna uma String  
       for (Fase fa : listaFase) {
           field.addItem(fa.getDescricao());
           System.out.println("Descrição="+fa.getDescricao());
        }  
        field.setSelectedItem(value); //Deixa o editor pré-selecionado com o valor da célula  
        return field;
    }
    @Override
    public Object getCellEditorValue() {
        return field.getSelectedItem().toString();  
    }

}  

// Metodo para dar refresh na tabela
    private void setaFaseExecucao() {
        FaseExecucaoDao dao = null ;
        try {
            dao = new FaseExecucaoDao();
            FaseExecucaoTableModel minhafase = new FaseExecucaoTableModel(dao.findbyfiltrochaves(Integer.parseInt(txtIdOs.getText()), Integer.parseInt(txtIdFicha.getText()), identificador)); 
            jTFases.setModel(minhafase); 
            jTFases.setPreferredSize(new java.awt.Dimension(1340, 144));  
        System.out.println("passou setaFaseExecucao ");
            defineRenderersFases();
//            int h = ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS;
//            int v = ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS;
            JScrollPane scroller = new JScrollPane(); 
            jScrollPane6.setViewportView(scroller);  
            scroller.setViewportView(jTFases);  

        } catch (SQLException ex) {
            Logger.getLogger(jIFOs.class.getName()).log(Level.SEVERE, null, ex);
        }
        try {
            dao.closeConnection();
        } catch (SQLException ex) {
            Logger.getLogger(jIFOs.class.getName()).log(Level.SEVERE, null, ex);
        }
        jTFases.setVisible(true);
    }

//metodo para Definir as propriedades da tabela
    private void defineRenderersFases() {
                   System.out.println("passou defineRenderersFases= ");
// Teclar Enter e pular para a proxima coluna editavel
    InputMap imap = jTFases.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);  
    imap.put(KeyStroke.getKeyStroke("pressed ENTER"), "selectNextColumnCell");  
        DefaultTableCellRenderer rendererCentro = new DefaultTableCellRenderer();  
        rendererCentro.setHorizontalAlignment(SwingConstants.CENTER);  
        DefaultTableCellRenderer rendererDireita = new DefaultTableCellRenderer();  
        rendererDireita.setHorizontalAlignment(SwingConstants.RIGHT);  
        DefaultTableCellRenderer rendererEsquerda = new DefaultTableCellRenderer();  
        rendererEsquerda.setHorizontalAlignment(SwingConstants.LEFT);  
            jTFases.getColumnModel().getColumn(0).setPreferredWidth(40);
            jTFases.getColumnModel().getColumn(1).setPreferredWidth(70);
            jTFases.getColumnModel().getColumn(2).setPreferredWidth(40);
            jTFases.getColumnModel().getColumn(3).setPreferredWidth(30);
            jTFases.getColumnModel().getColumn(4).setPreferredWidth(400);
            TableColumn colfase =  jTFases.getColumnModel().getColumn(4);
            TableColumn colsetor =  jTFases.getColumnModel().getColumn(6);
// Associando o ComboBox para a coluna
            colfase.setCellEditor(FaseComboEditor);
            jTFases.setDefaultEditor(Fase.class, new FaseComboEditor());  
            
            jTFases.setDefaultEditor(Setor.class, new SetorComboEditor());  
            jTFases.getColumnModel().getColumn(5).setPreferredWidth(30);
            jTFases.getColumnModel().getColumn(6).setPreferredWidth(400);
            jTFases.getColumnModel().getColumn(7).setPreferredWidth(150);
            jTFases.getColumnModel().getColumn(8).setPreferredWidth(150);
            jTFases.getColumnModel().getColumn(9).setPreferredWidth(300);
    }

// Linha da tabela no aplicativo
[img]

[/img]
Grato por qq ajuda.

Pessoal

Me dediquei mais em fazer alguns testes e estudar mais e conseguir resolver os problemas ocorridos com meu TableModel.
Desculpe-me por qq coisa.