Pessoal
Li alguns posts sobre a Jtable e tableModel e ainda não conseguir arquitetar uma maneira de fazer cadastro(crud) na minha “jTFases”. Parece que meu problema é de interface. Li o artigo de Felipe mas não conseguir entender a parte inicial de como cadastrar um novo produto com a tabela vazia?(como fazer isso da minha jInternalframe). tb li o artigo de alteração de Vini sobre a resposta de Leoloco com o exemplo de um procedimento de alteração modal, mas, não entendi bem ou não mostra como cadastrar numa tabela vazia? Por favor preciso de exemplos e respostas se vcs puderem sobre:
1)Tou usando o processo TableModel que acho bem flexivel e quanto a isso já está tudo ok.(FaseExecucaotableModel). já pronto.
2)Só podemos cadastrar numa jTableModel no java com essa estrutura Modal(fora da tabela)?
3)Tenho 2 tabelas realacionadas na minha jTableModel uma é a tabela de fase e outra a tabela de funcionários?
Como fazer um estilo Popup das tabelas relacionadas e dentro da propria interface selecionar esses registros com o pattern Dao?.
Obrigado pela paciência de vcs.
Vou postar meu codigo dessa parte:
/*
* To change this template, choFasee Tools | Templates
* and open the template in the editor.
*/
package TableModels;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.swing.JScrollPane;
import javax.swing.table.AbstractTableModel;
import modelo.FaseExecucao;
/**
*
* @author Octacilio
*/
public class FaseExecucaoTableModel extends AbstractTableModel {
private static final long serialVersionUID = 1L;
/* Lista de FaseExecucao que representam as linhas. */
private List<FaseExecucao> linhas;
/* Array de Strings com o nome das colunas. */
private String[] colunas = new String[]{
"Id.", "Descrição da Fase ", "Funcionário ", "Recepção "," Emissão ","Pessoa no Consultório "};
/* 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 pFasesui o nome das colunas
//System.out.println("nome da coluna=" +colunas[columnIndex]);
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: // Segunda coluna é o telefone, que também é uma String..
return String.class;
case 2: // Terceira coluna é a data de cadastro,
// apesar de ser do tipo Calendar,
// estou retornando Degerate por causa da formatação.
return String.class;
case 3: // Quarta coluna é a mensalidade, um double.
return Date.class;
case 4: // Quarta coluna é a mensalidade, um double.
return Date.class;
case 5: // 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);
// 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 0:
return faseexecucao.getId();
case 1:
return faseexecucao.getNomefase();
case 2:
return faseexecucao.getNomefuncionario();
case 3:
return faseexecucao.getRecepcao();
case 4:
return faseexecucao.getEmissao();
case 5:
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 0:
faseexecucao.setId(Integer.parseInt(aValue.toString()));
case 1:
faseexecucao.setNomefase(aValue.toString());
case 2:
faseexecucao.setNomefuncionario(aValue.toString());
case 3:
faseexecucao.setRecepcao((Date)(aValue));
case 4:
faseexecucao.setEmissao((Date)(aValue));
case 5:
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.setNomefase(aValue.getNomefase());
faseexecucao.setNomefuncionario(aValue.getNomefuncionario());
faseexecucao.setRecepcao(aValue.getRecepcao());
faseexecucao.setEmissao(aValue.getEmissao());
faseexecucao.setPessoaConsultorio(aValue.getPessoaConsultorio());
fireTableCellUpdated(rowIndex, 1);
fireTableCellUpdated(rowIndex, 2);
fireTableCellUpdated(rowIndex, 3);
fireTableCellUpdated(rowIndex, 4);
fireTableCellUpdated(rowIndex, 5);
}
;
;
@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
if (columnIndex < 1) {
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) {
}
}
// A minha Interface que quando o usuario clicar na tabela ira aparecer uma linha vazia(outra cor) ou se tiver registro já aparece automaticamente.
private void jTFasesMouseClicked(java.awt.event.MouseEvent evt) {
// TODO add your handling code here:
System.out.println("passou mouceclick minhafase");
//cria o modelo de Fase de execucao
FaseExecucaoDao dao = null;
try{
dao = new FaseExecucaoDao();
// como instanciar a jtable para digitar os campos? Nesse caso a tabela está vazia e está dando um erro de nullpointer?
model = new FaseExecucaoTableModel(dao.listAll());
//atribui o modelo à tabela
jTFases.setModel(model);
jTFases.setPreferredSize(new java.awt.Dimension(1340, 144));
defineRenderersFases();
JScrollPane scroller = new JScrollPane();
jScrollPane6.setViewportView(scroller);
scroller.setViewportView(jTFases);
// acho que aqui preciso fazer algo para mostrar uma linha na tabela vazia para preenchimento.
} 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);
}
}
// definerenderes jtFases
private void defineRenderersFases() {
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(700);
jTFases.getColumnModel().getColumn(2).setPreferredWidth(500);
jTFases.getColumnModel().getColumn(3).setPreferredWidth(120);
jTFases.getColumnModel().getColumn(4).setPreferredWidth(120);
jTFases.getColumnModel().getColumn(5).setPreferredWidth(400);
}