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:
- 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.