Migrando DefaultTableModel para AbstractTableModel

19 respostas
marcos.menezes

Caros amigos,

Implementei uma tabela usando DefaulTableModel mas quero mudar.

Alguem pode ficar disponivel hoje no msn para poder me ajudar, e mesmo assim quem estiver afim de me ajudar.
Estou desenvolvendo em MVC e estou com bastante duvidas.

Agradeço quem estiver disponivel.

MsN: [email removido]

19 Respostas

davidbuzatto

Trabalhar com os modelos para tabelas já foi discutido muitas vezes aqui. Usar a busca do fórum pode lhe poupar ter que criar um tópico.

Olhe aqui:

E aqui:
http://www.guj.com.br/posts/list/100793.java

[]´s

ViniGodoy

Olhe também aqui:
http://www.guj.com.br/posts/list/132698.java#714736

Sua tabela exibirá dados de que?

marcos.menezes

Vini,

Olhei esse link e foi de lá que tirei uma ideia de como fazer isso.

Minha tabela exbirá.

Nome do Serviço, Quantidade, Valor Unitario, Subtotal…

Nome do Serviço: É um JComboBox onde é exibido o serviço cadastrado, o usuario escolhe qual serviço que ele quer. ** Já está funcionando.
Quantidade: É um JTextField onde o usuario informa a quantidade para aquele serviço e logo em seguida clica em incluir
Valor Unitario: Retorna o valor Unitario do serviço já cadastrado na classe serviço.
Subtotal: Metodo para retornar a quantidade * valorUnitario

Obs: Essa inserção de dados na tabela já está funcionando.

Eu utilizei um array de Objetos da seguinte forma.

public JTable getTabelaOrcamento() { if (tabelaOrcamento == null) { Object[][] dados = new Object[0][0]; String nomeColunas[] = new String[]{"Nome do Serviço","Quantidade","Valor Unitário","Subtotal"}; DefaultTableModel modelo = new DefaultTableModel(dados,nomeColunas); tabelaOrcamento = new JTable(modelo); } return tabelaOrcamento; }

para add a linha:

public void addLinha(Servico s) { DefaultTableModel modelo = (DefaultTableModel)getTabelaOrcamento().getModel(); Object [] arrayDados = new Object[]{(String)comboNomeServico.getSelectedItem(),getTquantidade().getText(),s.getValor(),calculaSubtotal(s)}; somarTotal(s); modelo.addRow(arrayDados); }

ViniGodoy

Ok, e que classe contém esses dados?

marcos.menezes

Da classe Servico que tem os seguintes atributos.

nome, valor, garantia, validade.

No caso o que eu preciso é : nome e valor

ViniGodoy

E que classe tem a quantidade e o serviço?

marcos.menezes

Vini,

O Serviço (Nome do Serviço) é uma comboBox que o usuario seleciona o tipo de serviço que a empresa presta. (Esse serviço o usuario o cadastra antes, e nessa comboBox aparece preenchida).
A quantidade é informada na hora e em seguida o usuario clica em ADD para adicionar os dados a tabela.

Quando o serviço é adicionado na tabela é informado o: Nome do Serviço, Quantidade, Valor Unitario, Subtotal

Onde: O Nome do serviço é da classe serviço, a quantidade é preenchida na hora, o Valor Unitario ele puxa da classe Serviço e o Subtotal é um metodo.

Obrigado pela ajuda…

ViniGodoy

Certo, mas você está trabalhando com orientação à objetos, ou não?

Se estiver, provavelmente você tem uma classe, chamada serviço, que deve se parecer com essa:

public class Servico {
   private String nome;
   private int garantia;
   private double valor;

   public Servico(String nome, int garantia, double valor) {
      this.valor = valor;
      this.garantia = garantia;
      this.valor = valor;
   }

   public String getNome() { 
      return nome;
   }

   public double getValor() {
      return valor;
   }

   public int getGarantia() {
      return garantia;
   }
}

Então, você terá uma classe que associa um serviço a uma quantidade, capaz de calcular o valor total:

public class ItemServico {
   public Servico servico;
   public int quantidade;

   public ItemServico(Servico servico, int quant) {
      this.servico = servico;
   }

   public Servico getServico() {
      return servico;
   }

   public int getQuantidade() {
      return quantidade;
   }

   public double getTotal() {
      return servico.getValor() * quantidade;
   }
}

Finalmente, você terá uma classe que representa um pedido desses serviços, que é o que essa tela configura:

public class OrdemServico {
    public List<ItemServico> servicos = new ArrayList<ItemServico>(); // --> Isso é o que será desenhado na tabela
    
    public void OrdemServico() {
    }

    public void adicionarServico(ItemServico is) {
       servicos.add(is);
    }

    public double getTotal() {
       double total = 0;
       for (ItemServico is : servicos) {
          total += is.getTotal();
       }
       return total;
    }
}

Você não tem nada parecido?

marcos.menezes

Vini,

Sim, estou trabalhando com orientação a objeto.

Obrigado, eu estou arrumando uma M que fiz ontem no meu projeto, assim que terminar vou analisar com calma, mas é isso mesmo, vou testar aqui e logo respondo.

Agradeço pela sua ajuda e qualquer coisa volto a postar aqui mesmo…

ViniGodoy

Ótimo, mostre como estão suas classes de negócio (estilo as que fiz ali em cima) e então mostro para você como fazer um AbstractTableModel para a classe OrdemServico.

marcos.menezes

Vini,

Eu nao sei se conhece, mas estou usando o Eclipse Visual Edition.
Meu projeto está dividio nos seguintes pacotes: modelo, visao, controle e DAO, estou usando tambem o Hibernate.
Eu ainda nao a fiz, mas a classe ItemOrcamento irá guardar as linhas da tabela, entao ela é composta dos seguintes atributos: valor e quantidade.
Fiz isso por que, no meu caso o orçamento é valido por 30 dias, entao, se por um acaso aconteça algum aumento que precise aumentar o valor da materia prima e consequente o serviço, quando o cliente entrar em contato ou vice e versa, quando o usuario for pesquisar sobre o orçamento pendente, nao correr o risco de dar um outro valor ao orçamento.
Pra implementar a tabela eu usei aquele JScrollPane on JTable, eu um JPanel.
Vou mandar para o seu email a tela para que voce possa visualizar e entender melhor...

Classe Serviço

package modelo;

public class Servico
{
	private String nome, valor, garantia, validade;

	public String getGarantia() {
		return garantia;
	}

	public void setGarantia(String garantia) {
		this.garantia = garantia;
	}

	public String getNome() {
		return nome;
	}

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

	public String getValidade() {
		return validade;
	}

	public void setValidade(String validade) {
		this.validade = validade;
	}

	public String getValor() {
		return valor;
	}

	public void setValor(String valor) {
		this.valor = valor;
	}	
}

Classe Orçamento

package modelo;

import java.util.Date;

public class Orcamento
{
	private String cpf, cnpj, codigoOrcamento, nomeServico, status;
	private int quantidade;
	private Double valorTotal;
	private Date data;	
	
	public String getCodigoOrcamento() {
		return codigoOrcamento;
	}
	public void setCodigoOrcamento(String codigoOrcamento) {
		this.codigoOrcamento = codigoOrcamento;
	}
	public String getCnpj() {
		return cnpj;
	}
	public void setCnpj(String cnpj) {
		this.cnpj = cnpj;
	}
	public String getCpf() {
		return cpf;
	}
	public void setCpf(String cpf) {
		this.cpf = cpf;
	}
	public Date getData() {
		return data;
	}
	public void setData(Date data) {
		this.data = data;
	}
	public String getNomeServico() {
		return nomeServico;
	}
	public void setNomeServico(String nomeServico) {
		this.nomeServico = nomeServico;
	}
	public int getQuantidade() {
		return quantidade;
	}
	public void setQuantidade(int quantidade) {
		this.quantidade = quantidade;
	}
	public String getStatus() {
		return status;
	}
	public void setStatus(String status) {
		this.status = status;
	}
	public Double getValorTotal() {
		return valorTotal;
	}
	public void setValorTotal(Double valorTotal) {
		this.valorTotal = valorTotal;
	}	
}

Classe OrdemServico

package modelo;

import java.util.Date;

public class OrdemServico
{
	private String cpf, cnpj, ordemServico, status;
	private Double valorTotal;
	private Date dataEntrega, dataPromessa, dataRealEntrega;
	public String getCnpj() {
		return cnpj;
	}
	public void setCnpj(String cnpj) {
		this.cnpj = cnpj;
	}
	public String getCpf() {
		return cpf;
	}
	public void setCpf(String cpf) {
		this.cpf = cpf;
	}
	public Date getDataEntrega() {
		return dataEntrega;
	}
	public void setDataEntrega(Date dataEntrega) {
		this.dataEntrega = dataEntrega;
	}
	public Date getDataPromessa() {
		return dataPromessa;
	}
	public void setDataPromessa(Date dataPromessa) {
		this.dataPromessa = dataPromessa;
	}
	public Date getDataRealEntrega() {
		return dataRealEntrega;
	}
	public void setDataRealEntrega(Date dataRealEntrega) {
		this.dataRealEntrega = dataRealEntrega;
	}
	public String getOrdemServico() {
		return ordemServico;
	}
	public void setOrdemServico(String ordemServico) {
		this.ordemServico = ordemServico;
	}
	public String getStatus() {
		return status;
	}
	public void setStatus(String status) {
		this.status = status;
	}
	public Double getValorTotal() {
		return valorTotal;
	}
	public void setValorTotal(Double valorTotal) {
		this.valorTotal = valorTotal;
	}	
}
marcos.menezes

Vini,

Link pra visualizar a tela.

=http://img245.imageshack.us/i/telaorcamento.jpg/]

Obrigado!!

ViniGodoy

Tem certeza que todos os atributos da classe Servico são Strings?

marcos.menezes

Ops, sao nao, mas eu coloquei nao sei por que.

Serviço:

Nome - String
valorUnitario: Double
garantia: boolean
validadeGarantia: int

ViniGodoy

Estava olhando suas classes, me parece que você se empolgou um pouco nos gets e sets.

Por exemplo, na classe Orcamento, não é possível só calcular o valor total? Nesse caso, para que colocar um campo ali?

Outra coisa. Se você tem uma classe chamada Servico, você deve guardar um Servico dentro do Orcamento, e não só o nome dele. Assim você terá acesso a outros campos importantes do servico, como seu valor, o que te permitirá calcular o valor total.

O mesmo vale para a classe OrdemServico. Ela não contém, na verdade, uma série de orcamentos? Nesse caso, coloque dentro dela um List<Orcamento>, e calcule coisas como o valor total.

É esse list que exibiremos na tabela. Você não tem MVC de verdade enquanto trabalhar com o DefaultTableModel. Ele duplica informações e lógica de modelo na view. Vamos organizar as classes, e então pensamos no seu Model. De qualquer forma, isso já vai facilitar muito seu trabalho no futuro.

marcos.menezes

Vini,

Eu acho que entendi que voce falou, voce disse que preciso usar mais ou menos assim.

public class Orcamento { private Servico servico; // Outros atributos do orcamento }

Foi isso que entendi, é assim mesmo?

Assim eu to fazendo as relações das classes para o sistema entender e não somente o banco de dados.

ViniGodoy

Isso mesmo.

R

ViniGodoy:
Olhe também aqui:
http://www.guj.com.br/posts/list/132698.java#714736

Sua tabela exibirá dados de que?

tem um exemplo completo.
Tenta ai e diz quais os erros e o que vc não conseguiu fazer.

adriano_si

rjbcordeiro:
ViniGodoy:
Olhe também aqui:
http://www.guj.com.br/posts/list/132698.java#714736

Sua tabela exibirá dados de que?

tem um exemplo completo.
Tenta ai e diz quais os erros e o que vc não conseguiu fazer.

Poutz cara… você viu a data da dúvida ??? Alguém tranca, please…

Criado 13 de novembro de 2009
Ultima resposta 28 de jul. de 2011
Respostas 19
Participantes 5