Cara se eu soubesse usar Jtable sem DefaultTableModel, eu faria isso sim. Me dá um exemplo sem uso DefaultTableModel para que eu possa melhorar este problema. Outra coisa, eu estou apredendo java ainda, porém você consegue mesmo ver que o meu nível de conhecimento em java é muito inferior em relação a sua, por isso estou pedindo ajuda.
Se você poder me ajudar eu agradeço muito, senão poder também eu entendo.
Se você quer se livrar do Default, eu te ajudo sem problemas. Nem que gastemos uns 200 posts para isso, e eu tenha que elaborar um exemplo baseado nas suas próprias classes de negócio.
Agora, seu argumento não é lá muito válido. Quanto tempo você gastou aprendendo a usar o default? Quanto tempo você está gastando nesse for, para achar um problema que o default te gerou? Quanto tempo você vai gastar, fazendo casts, entendendo como driblar as limitações que o default te dá?
Se você tem tempo e capacidade para aprender a usar o default, terá também para aprender a não usa-lo.
Bem, aqui está um exemplo para um TableModel de livros:
http://www.guj.com.br/posts/list/132698.java#714736
Se quiser, poste a estrutura da classe que está sendo exibida na JTable, e diga que campos você quer exibir na tabela, que te ajudamos a montar um modelo similar para sua própria classe. Você vai ver que você está atualmente trabalhando jeito difícil, não do jeito fácil.
Eu quero aprender a não usar defaultTabeleModel, pois muita pesquisas que já fiz fala sobre isso, só que não sei fazer.
Vou postar código para você me ajudar.
vlw
Seguinte Vini, eu estou trazendo do banco da tabela produto para JComboBox(código) e JTxtField’s(descrição,preço,tamanho,cor cada JTxtField corresponde a código selecionado no combo), quando informo a quantidade ele calcula valor total do produto. A cada produto calculado é adicionado na tabela(código,descrição,preço,quantidade e valor total) e depois de todo produto ser adicionado na Jatable queria incluir no banco. Daí que veio problema toda.
Segue código da classe produto:
[code]@Entity
public class Produto {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int codigo;
private int codigoProduto;
private String nome;
private String modelo;
private String cor;
private String sexo;
private String tamanho;
private float valorCusto;
private double valorVenda;
private int quantidade;
@ManyToOne
@JoinColumn(name="codigo_for")
private Fornecedor fornecedor;
@ManyToOne
@JoinColumn(name="codigoLoja")
private Loja loja;
public int getCodigo() {
return codigo;
}
public void setCodigo(int codigo) {
this.codigo = codigo;
}
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public String getModelo() {
return modelo;
}
public void setModelo(String modelo) {
this.modelo = modelo;
}
public String getSexo() {
return sexo;
}
public void setSexo(String sexo) {
this.sexo = sexo;
}
public String getTamanho() {
return tamanho;
}
public void setTamanho(String tamanho) {
this.tamanho = tamanho;
}
public String getCor() {
return cor;
}
public void setCor(String cor) {
this.cor = cor;
}
public float getValorCusto() {
return valorCusto;
}
public void setValorCusto(float valorCusto) {
this.valorCusto = valorCusto;
}
public int getCodigoProduto() {
return codigoProduto;
}
public void setCodigoProduto(int codigoProduto) {
this.codigoProduto = codigoProduto;
}
public String toString(){
return"" +codigoProduto;
}
/**
* @return the fornecedor
*/
public Fornecedor getFornecedor() {
return fornecedor;
}
/**
* @param fornecedor the fornecedor to set
*/
public void setFornecedor(Fornecedor fornecedor) {
this.fornecedor = fornecedor;
}
/**
* @return the valorVenda
*/
public double getValorVenda() {
return valorVenda;
}
/**
* @param valorVenda the valorVenda to set
*/
public void setValorVenda(double valorVenda) {
this.valorVenda = valorVenda;
}
/**
* @return the loja
*/
public Loja getLoja() {
return loja;
}
/**
* @param loja the loja to set
*/
public void setLoja(Loja loja) {
this.loja = loja;
}
/**
* @return the quantidade
*/
public int getQuantidade() {
return quantidade;
}
/**
* @param quantidade the quantidade to set
*/
public void setQuantidade(int quantidade) {
this.quantidade = quantidade;
}
/**
* @return the numeroNotaFiscal
*/
/**
* @return the dataEntrada
*/
}
[/code]
método que calcula preço total
public Double CalculaprecoTotal(){
String p= JLbPreco.getText();
String q= JTxtQuantidade.getText();
Double preco = Double.parseDouble(JLbPreco.getText());
Integer quantidade = Integer.parseInt(JTxtQuantidade.getText());//.replace(",", "."));
Double valorTotal = preco * quantidade;
return valorTotal;
}
Método que adiciona dados para Jtable
[code] try{
if(!JTxtQuantidade.getText().trim().isEmpty()){
DefaultTableModel dtm = (DefaultTableModel) jtProdutos.getModel();
DefaultComboBoxModel dcbm = (DefaultComboBoxModel) JCBoxCodigoProduto.getModel();
dtm.addRow(new Object[] {JTxtNomeProduto.getText(), dcbm.getSelectedItem().toString(), Double.parseDouble(JTxtPreco.getText()), Double.parseDouble(JTxtQuantidade.getText()), CalculaprecoTotal()});
}
else{
JOptionPane.showMessageDialog(null,“Informe a quantidade para que possa ser adicionado na tabela”);
}
}
catch(Exception e){
JOptionPane.showMessageDialog(null,“erro ao adicionar produto na tabela”+e.getMessage());
e.printStackTrace();
}
}
[/code]
Método que remove
DefaultTableModel dtm = (DefaultTableModel) jtProdutos.getModel();
int[] x = jtProdutos.getSelectedRows();//captura as linhas selecionadas
for(int i =(x.length-1);i>=0;--i){
dtm.removeRow(x[i]);//remove todas as linhas selecionadas
Método para inserir na tabelam Item
[code]public void inserirItemvenda()
{
try{
for (int i = 0 ; i < jtProdutos.getRowCount() ; i++)
{
//if (jtProdutos.getValueAt(i, 0).equals(true))
ctrItem = new CTR_ManterItemVenda();
CTR_ManterProduto ctrProdutos = new CTR_ManterProduto();
Produto produto = new Produto();
NumberFormat format =NumberFormat.getInstance();
ItemVenda item = new ItemVenda();
String aux1=(String)jtProdutos.getValueAt(i,2);
item.setValorUnitario((Double)format.parse(aux1));
String aux2=(String)jtProdutos.getValueAt(i, 3);
item.setQuantidade((Integer) format.parse(aux2));
String aux3=(String)jtProdutos.getValueAt(i, 4);
item.setValorTotal((Double)format.parse(aux3));
item.setTamanho(String.valueOf(JTxtTamanho));
item.setCor(String.valueOf(JTxtCor));
produto = (Produto) ctrProdutos.carregarProdutoCodigoProduto((Integer) jtProdutos.getValueAt(i, 1));
item.setIdProduto(produto);
item.setIdVenda(venda);
ctrItem.gravarItemVenda(item);
}
}
catch(Exception e){
JOptionPane.showMessageDialog(null,"Erro ao persistir objeto item venda: "+e.getMessage());
e.printStackTrace();
}
}[/code]
classe intem venda
[code]@Entity
public class ItemVenda
{
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer idItemVenda;
@ManyToOne
private Produto idProduto;
@ManyToOne
private Venda idVenda;
private Integer quantidade;
private String cor;
private String tamanho;
private double valorUnitario;
private double valorTotal;
private double valorVencimento;
private String dataVencimento;
public Integer getIdItemVenda() {
return idItemVenda;
}
public void setIdItemVenda(Integer idItemVenda) {
this.idItemVenda = idItemVenda;
}
public Produto getIdProduto() {
return idProduto;
}
public void setIdProduto(Produto idProduto) {
this.idProduto = idProduto;
}
public Venda getIdVenda() {
return idVenda;
}
public void setIdVenda(Venda idVenda) {
this.idVenda = idVenda;
}
public double getValorUnitario() {
return valorUnitario;
}
public void setValorUnitario(double valorUnitario) {
this.valorUnitario = valorUnitario;
}
/**
* @return the tamanho
*/
public String getTamanho() {
return tamanho;
}
/**
* @param tamanho the tamanho to set
*/
public void setTamanho(String tamanho) {
this.tamanho = tamanho;
}
/**
* @return the cor
*/
public String getCor() {
return cor;
}
/**
* @param cor the cor to set
*/
public void setCor(String cor) {
this.cor = cor;
}
/**
* @return the valorVencimento
*/
public double getValorVencimento() {
return valorVencimento;
}
/**
* @param valorVencimento the valorVencimento to set
*/
public void setValorVencimento(double valorVencimento) {
this.valorVencimento = valorVencimento;
}
/**
* @return the dataVencimento
*/
public String getDataVencimento() {
return dataVencimento;
}
/**
* @param dataVencimento the dataVencimento to set
*/
public void setDataVencimento(String dataVencimento) {
this.dataVencimento = dataVencimento;
}
/**
* @return the valorTotal
*/
public double getValorTotal() {
return valorTotal;
}
/**
* @param valorTotal the valorTotal to set
*/
public void setValorTotal(double valorTotal) {
this.valorTotal = valorTotal;
}
/**
* @return the quantidade
*/
public Integer getQuantidade() {
return quantidade;
}
/**
* @param quantidade the quantidade to set
*/
public void setQuantidade(Integer quantidade) {
this.quantidade = quantidade;
}
}
[/code]
Qualquer coisa é só falar.
Ok, e que informações tem nas colunas da sua JTable? O que você quer listar na tabela?
Ah, agora que eu vi ali.
Ok, você então tem uma lista de produtos, e deseja listar os campos: código,descrição,preço,quantidade e valor total
Essas são as colunas do seu JTable, Certo?
Outra coisa. Como é calculado o valor total? Ele é o obtido pelo preço de venda vezes a quantidade?
Crie um método na classe Produto, para que ele mesmo saiba calcular o valor total.
"
Tenho outras dúvidas. A Tabela listará produtos ou ItemVenda?
Por que o itemVenda tem preço e quantidades, e o produto também?
código,descrição,preço,quantidade e valor total. São as colunas da Jtable!
O valor total é obtido pelo preço de venda vezes a quantidade!
Para criar este método eu precisaria de dados da JTxtField preço vindo do banco e quantidade informada pelo usário no fomrulário de venda, como capturo isso? Se eu tiver errado poder-me corrigir.
Sim. Que são colunas da JTable eu entendi. Mas essas colunas mostram dados de que objeto? Ou seja, se eu olhar para uma linha da sua JTable, estarei enxergando informações a respeito de que classe?
Veja bem. A JTable não existe “por si só”. Ela exibe alguma informação de suas classes. No caso do exemplo que eu passei ali em cima, a JTable lista livros. A sua JTable pode listar informações do produto, ou do ItemDeVenda, que aparentemente tem as informações que você colocou.
O ideal é sempre trabalhar com os objetos, nunca só com os valores soltos. Aparentemente, sua JTable lida com produtos, já que você está sendo obrigado a converter dados dela para um objeto da classe Produto, e provavelmente está fazendo o contrário também.
Você pode colocar um screenshot da sua tela atualmente? Aí fica mais fácil da gente se comunicar.
Tenho outras dúvidas. A Tabela listará produtos ou ItemVenda?
Reposta: a tabela listara dados do produto(codigo selecionado no combo,descriçao e preço correspondente a este código,valor total de cada produto, mais a quantidade informada.
Por que o itemVenda tem preço e quantidades, e o produto também?
Resposta: o item venda tem preço, quantidade e o produto, pois vou precisar de exibir o relatório de produto que foi mais vendido no mês, de que cor e quantidade, e qual foi o seu preço total com desconto.
Será que fui claro na explicação? Senão eu tento explicar da outra forma.
[quote]Sim. Que são colunas da JTable eu entendi. Mas essas colunas mostram dados de que objeto? Ou seja, se eu olhar para uma linha da sua JTable, estarei enxergando informações a respeito de que classe?
Veja bem. A JTable não existe “por si só”. Ela exibe alguma informação de suas classes. No caso do exemplo que eu passei ali em cima, a JTable lista livros. A sua JTable pode listar informações do produto, ou do ItemDeVenda, que aparentemente tem as informações que você colocou.
O ideal é sempre trabalhar com os objetos, nunca só com os valores soltos. Aparentemente, sua JTable lida com produtos, já que você está sendo obrigado a converter dados dela para um objeto da classe Produto, e provavelmente está fazendo o contrário também.
Você pode colocar um screenshot da sua tela atualmente? Aí fica mais fácil da gente se comunicar.[/quote]
A minha Jtable exibe dados da classe produto que são:código,nome e preço.
Já quatidade jogo o que foi informada na JTxtField e o preço total, vem do calculo do preço total(preço x quantidade);
Ok, então vamos pensar num TableModel que, dada uma lista de objetos da classe Produto a exiba. É com a classe produto que iremos trabalhar, então, é ela que será representada no TableModel.
Antes de tudo, você tem que entender que quem chama os métodos padrão do TableModel (getColumnName(), getValueAt, etc) é o JTable. Não é você. Você irá chamar métodos que você vai adicionar no model, para inserir produtos, ou remover produtos da tabela. Os demais, é a tabela que irá usar, para perguntar para você que informações ela deve listar, na hora de construir a interface gráfica.
Pense assim. O Swing começa a desenhar a tabela. Mas ele ainda nem sabe quantas linhas ou quantas colunas sua tabela terá. O que ele faz? Ele pergunta para o model. Então, sempre encare os métodos padrão do model como respondendo a perguntas do Swing. Ok?
public class ProdutosTableModel extends AbstractTableModel {
//Primeiro criamos constantes, para nossas colunas
private static final int COL_CODIGO = 0;
private static final int COL_DESCRICAO = 1;
private static final int COL_PRECO = 2;
private static final int COL_QUANTIDADE = 3;
private static final int COL_TOTAL = 4;
private List<Produto> valores; //A lista de produtos que pretendemos exibir
//Esse é um construtor, que recebe a nossa lista de produtos
public ProdutosTableModel(Collection<Produto> valores) {
this.valores = new ArrayList<Produto>(valores);
}
public int getRowCount() {
//Quantas linhas tem sua tabela? Uma para cada item da lista.
return valores.size();
}
public int getColumnCount() {
//Quantas colunas tem a tabela? Na sua tabela, 5.
return 5;
}
public String getColumnName(int columnIndex) {
//Qual é o nome das nossas colunas? Isso aparecerá no cabeçalho
if (columnIndex == COL_CODIGO) return "Código";
if (columnIndex == COL_DESCRICAO) return "Descrição";
if (columnIndex == COL_PRECO) return "Preço";
if (columnIndex == COL_QUANTIDADE) return "Quantidade";
if (columnIndex == COL_TOTAL) return "Total";
}
public Object getValueAt(int row, int column) {
//Precisamos retornar o valor da coluna column e da linha row.
//O JTable chama esse método quando precisa desenhar uma célula. E só ele deve chama-lo.
//Você usará um método muito mais conveniente, chamado getProduto()
Produto prod = valores.get(row);
if (column == COL_CODIGO) prod.getCodigo();
if (column == COL_DESCRICAO) prod.getNome(); //A descrição é só o nome mesmo?
if (column == COL_PRECO) return prod.getPreco();
if (column == COL_QUANTIDADE) return prod.getQuantidade();
if (column == COL_TOTAL) return prod.getTotal(); //Esse método é o que eu disse que seria legal criar.
}
//Você deve implementar o setValueAt se sua tabela for editável.
//Nesse exemplo, vou deixar alterar só a quantidade.
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
try {
if (columnIndex == COL_QUANTIDADE) valores.get(rowIndex).setQuantidade(Integer.parseInt(aValue.toString()));
} catch (Exception e) {
//Em caso de exceção, deixo o produto inalterado. Isso fará com que os valores antigos sejam desenhados.
//Pode ocorrer caso o usuário digite uma letra na quantidade, por exemplo.
}
}
public Class getColumnClass(int columnIndex) {
//Qual a classe das nossas colunas?
if (columnIndex == COL_CODIGO) return Integer.class;
if (columnIndex == COL_DESCRICAO) return String.class;
//As demais são double
return Double.class;
}
boolean isCellEditable(int rowIndex, int columnIndex) {
//Indicamos se a célula da rowIndex e da columnIndex é editável. Somente a quantidade é editavel nesse exemplo
return columnIndex == COL_QUANTIDADE;
}
//Já que esse tableModel é de produtos, vamos fazer um get que retorne um produto inteiro.
//Isso elimina a necessidade de chamar o getValueAt() nas telas.
public Produto get(int row) {
return valores.get(row);
}
// --- Já respondemos ao Swing o que ele queria saber. Agora é hora de adicionar métodos para nós mesmo. :)
//Esse método permite adicionar um produto na JTable
public void add(Produto produto) {
//Adicionamos o produto
valores.add(produto);
//Avisamos a table, para que redesenhe a linha
fireTablesRowInserted(valores.size()-1, valores.size()-1);
}
public List<Produto> getProdutos() {
return Collections.unmodifiableList(valores);
}
}
Tente substituir seu DefaultTableModel por esse. Ok, você vai ter que modificar sua tela quase inteira, mas veja que agora você tem um método “get” que retorna um produto inteiro e o método “add”, que adiciona um produto inteiro.
O usuário então preencherá a tela, com os dados do produto que quer adicionar. Quando ele clicar em “Adicionar”, você irá gerar um novo objeto da classe produto, e adiciona-lo diretamente no JTable.
Sua JTable pode ser preenchida inicialmente com os dados vindos do banco. Provavelmente o Hibernate já te retornará um List<Produto>. Caso queira a tabela vazia, é só passar um List em branco.
O model também te fornece o método getProdutos(), que permite listar todos os produtos dentro do JTable. Note que, usando esses métodos (add, get, e getProdutos()), não será necessário usar nem o getValueAt() nem o setValueAt(), e também não será necessário fazer casts, nem será necessário dar new na classe produto.
Vou fazer isso agora, qualquer coisa retorno.
Só uma pergunta, estou usando IDE NetBeans, então tenho que eliminar o componente Jtable que eu peguei da paleta?
Não, não. Você só vai alterar o model dele. O JTable continua o mesmo.
Não sei exatamente onde define o model no Netbeans, mas em algum lugar você vai fazer algo como:
List<Produto> produtos = ProdutosDao.carregarProduto();
seuTable.setModel(new ProdutosTableModel(produtos));
Ou, caso queira uma tabela vazia:
Neste método aparece erro sublinhado de vermelho no ProdutosTableModel
Erro:
java:1273: br.com.karinhaEstoque.view.formInclusaoVenda.ProdutosTableModel is not abstract and does not override abstract method getValueAt(int,int) in javax.swing.table.TableModel
public class ProdutosTableModel extends AbstractTableModel{
Posta seu model aí.
O Vini, é esse método mesmo?
fireTablesRowAdded(int,int)???
Deve ser sobre isso que o rapaz ta falando…
Não seria esse?
fireTablesRowsInserted(int,int)
[]'s
É verdade, é fireTableRowsInserted