Bom dia a todos…
Estou desenvolvendo um programa e em um dos formulários vou exibir os serviços prestados a um determinado cliente e para isso vou utilizar um JTable para exibir estes serviços prestados.
No GUJ vi artigos sobre a utilização do AbstractTableModel e resolvi adaptar o modelo apresentado em um deles para criar meu modelo para exibir e manipular os dados na tabela:
package models;
import java.util.ArrayList;
import java.util.List;
import javax.swing.table.AbstractTableModel;
/* Implementação de TableModel para exibição da lista de Serviços de Consultoria do robô de Consultoria
- Adaptação do modelo apresentado no site http://www.guj.com.br/java/225793-exemplo-de-tablemodel#1156821 por Eric Yuzo
adaptado por Fábio Alves (F3165421)*/
public class TabelaServicos extends AbstractTableModel{
/**
*
*/
private static final long serialVersionUID = -4426639859052214442L;
private List <ServicoConsultoria> linhas;
private String[] colunas = new String[]{"Tipo de Serviço","Serviço Prestado","Quantidade","Valor do Serviço" };
public TabelaServicos(){
linhas = new ArrayList<ServicoConsultoria>();
}
public TabelaServicos(List<ServicoConsultoria> listaServicoConsultoria){
linhas = new ArrayList<ServicoConsultoria>(listaServicoConsultoria);
}
@Override
public int getRowCount() {
return linhas.size();
}
@Override
public int getColumnCount() {
return colunas.length;
}
/* Retorna o nome da coluna no índice especificado.
* Este método é usado pela JTable para saber o texto do cabeçalho. */
@Override
public String getColumnName(int columnIndex) {
// Retorna o conteúdo do Array que possui o nome das colunas
// no índice especificado.
return colunas[columnIndex];
};
/* Retorna a classe dos elementos da coluna especificada.
* Este método é usado pela JTable na hora de definir o editor da célula. */
@Override
public Class<?> getColumnClass(int columnIndex) { // ajustar
// 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 tipo de serviço - String.
return String.class;
case 1: // Segunda coluna é o serviço prestado - String..
return String.class;
case 2: // Terceira coluna é a quantidade de serviços prestados - int
return Integer.class;
case 3: // Quarta coluna é o valor unitário do serviço, um double.
return Double.class;
default:
// Se o índice da coluna não for válido, lança um
// IndexOutOfBoundsException (Exceção de índice fora dos 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("columnIndex out of bounds");
}
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
ServicoConsultoria servicoConsultoria = linhas.get(rowIndex);
switch(columnIndex){
case 0:
return servicoConsultoria.getTipoServico();
case 1 :
return servicoConsultoria.getServicoPrestado();
case 2:
return servicoConsultoria.getQtdServicos();
case 3:
return servicoConsultoria.getVlrServico();
default:
throw new IndexOutOfBoundsException("Servico de Consultoria Inexistente");
}
}
/* public void setValueAt(Object obj, int rowIndex, int columnIndex){
ServicoConsultoria servicoConsultoria = linhas.get(rowIndex);
switch(columnIndex){
case 0:
servicoConsultoria.setNrServicoConsultoria((String)obj);
case 1:
servicoConsultoria.setCliente((String)obj);
case 2:
servicoConsultoria.setAgencia((String)obj);
case 3:
servicoConsultoria.setContaCorrente((String)obj);
case 4:
servicoConsultoria.setMoeda((String)obj);
default:
throw new IndexOutOfBoundsException("ServicoConsultoria Inexistente");
}
}*/
@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
return false;
}
public ServicoConsultoria getServicoConsultoria(int indiceLinha) {
return linhas.get(indiceLinha);
}
/* Adiciona um registro. */
public void addServicoConsultoria(ServicoConsultoria servicoConsultoria) {
// Adiciona o registro.
linhas.add(servicoConsultoria);
// Pega a quantidade de registros e subtrai um para achar
// o último índice. É preciso subtrair um, pois os índices
// começam pelo zero.
int ultimoIndice = getRowCount() - 1;
// Reporta a mudança. O JTable recebe a notificação
// e se redesenha permitindo que visualizemos a atualização.
fireTableRowsInserted(ultimoIndice, ultimoIndice);
}
/* Remove a linha especificada. */
public void removeServicoConsultoria(int indiceLinha) {
// Remove o serviço da linha especificada.
linhas.remove(indiceLinha);
// Reporta a mudança. O JTable recebe a notificação
// e se redesenha permitindo que visualizemos a atualização.
fireTableRowsDeleted(indiceLinha, indiceLinha);
}
/* Adiciona uma lista de serviços ao final dos registros. */
public void addListaDeServicoConsultorias(List<ServicoConsultoria> ServicoConsultorias) {
// Pega o tamanho antigo da tabela.
int tamanhoAntigo = getRowCount();
// Adiciona os registros.
linhas.addAll(ServicoConsultorias);
// Reporta a mudança. O JTable recebe a notificação
// e se redesenha permitindo que visualizemos a atualização.
fireTableRowsInserted(tamanhoAntigo, getRowCount() - 1);
}
/* Remove todos os registros. */
public void limpar() {
// Remove todos os elementos da lista de serviços.
linhas.clear();
// Reporta a mudança. O JTable recebe a notificação
// e se redesenha permitindo que visualizemos a atualização.
fireTableDataChanged();
}
/* Verifica se este table model está vazio. */
public boolean isEmpty() {
return linhas.isEmpty();
}
}
Estou utilizando o WindowBuilder do Eclipse para construir a parte gráfica deste formulário e ao incluir os componentes JScrollPane e JTable fiz os ajustes no código e ele ficou assim:
JScrollPane scrollPane = new JScrollPane();
scrollPane.setFont(new Font("Arial", Font.PLAIN, 12));
scrollPane.setBounds(88, 413, 814, 130);
contentPane.add(scrollPane);
TabelaServicos modelo = new TabelaServicos();
tblServicos = new JTable();
tblServicos.setFont(new Font("Arial", Font.PLAIN, 12));
tblServicos.setModel(modelo);
scrollPane.setViewportView(tblServicos);
Depois, para testar se o TableModel deu certo fiz a linha tblServicosl.getModel(). para verificar se o Eclipse “puxava” todos os métodos do meu TableModel, porém isso não aconteceu: o Eclipse “puxou” apenas os métodos da superclasse (AbstractTableModel)…tentei ainda passar o modelo no construtor da JTable porém ainda não funcionou…
Alguém poderia me dar uma dica de onde estou errando? Estou precisando acertar isso com urgência para que eu possa continuar com o desenvolvimento do meu programa.
Valeu!!!