Dúvidas envolvendo a Tela vendas com JTable

Boa tarde galera, to com uma Dúvida aqui envolvendo JTable dentro de uma tela de vendas, seguinte.: Tenho uma tela de vendas onde o usuário terá um ComboBox para verificar quais mercadorias ele possui, ele irá selecionar a mercadoria que ele nescessita e clicar no botão incluir, essa mercadoria irá para a JTable, 1° Dúvida, como fazer um evento onde a JTable recebe esse dado selecionado após o usuário clicar no botão incluir??? 2° Dúvida, na JTable terá um campo chamado R$Preço, que irá conter o preço de cada mercadoria, então caso o usuário selecione mais de uma mercadoria, como fazer para somar o preço de cada mercadoria contida na JTable…??? Se o usuario selecionar 3 mercadorias, como somar o preço dessas tres que estão contidas na JTable???

Eu tenti postar a tela aqui mas não conseguir…

Aconselho a vc estudar duas coisas:

  • ActionListener
  • Padrao Observer

Alem claro de TableModel, customizando o teu proprio utilizando o AbstractTableModel…

[quote=Fernando Generoso da Rosa]Aconselho a vc estudar duas coisas:

  • ActionListener
  • Padrao Observer

Alem claro de TableModel, customizando o teu proprio utilizando o AbstractTableModel…

[/quote]
Então cara, eu sei utilizar o ActionListener, mas eu não estou conseguindo pensar numa lógica pra colocar dentro desse evento, e eu ja tenho meu TableModel criado…

Simples. Dentro do ActionListener crie um novo objeto do tipo que o seu TableModel trabalha e mande adicionar nele.

Voce precisa guardar a referencia do Model para isso.

Certo, eu entendi mas não to conseguindo visualizar na programação, será que tem como você me da um exemplo de como seria na pratica esse evento??
Vo postar meu Model…

[code]package Apresentacao;

import Negocio.Venda;

import java.util.ArrayList;

import java.util.List;

import javax.swing.table.AbstractTableModel;

public class ContatoTableModel extends AbstractTableModel {

private static final int COL_NOME = 0;

private static final int COL_QUANTIDADE = 1;

private static final int COL_DESCRICAO = 2;

private static final int COL_PRECO = 3;



private List<Venda> venda;



// Esse é um construtor, que recebe a nossa lista de Contatos

public ContatoTableModel(List<Venda> venda) {

    this.venda = new ArrayList<Venda>(venda);

}



public int getRowCount() {

    // Quantas linhas tem sua tabela? Uma para cada item da lista.

    return venda.size();

}



public int getColumnCount() {

    // Quantas colunas tem a tabela? Nesse exemplo, só 3.

    return 4;

}



public String getColumnName(int columnIdx) {

    // Qual é o nome das nossas colunas?

     if (columnIdx == COL_NOME)

        return "Nome";

    if (columnIdx == COL_QUANTIDADE)

        return "Quantidade";

    if (columnIdx == COL_DESCRICAO)

        return "Descição";

    if (columnIdx == COL_PRECO)

        return "Preço";

    return ""; // Nunca deve ocorrer

}



public Object getValueAt(int row, int column) {

    // Precisamos retornar o valor da coluna column e da linha row.

    Contato con = venda.get(row);

    if (column == COL_NOME)

        return venda.getINome();

    if (column == COL_QUANTIDADE)

        return venda.getQuantidade();

    if (column == COL_DESCRICAO)

        return venda.getDescricao();

    if (column == COL_PRECO)

        return venda.getTPreco();

    return ""; // Nunca deve ocorrer

}



public void setValueAt(Object aValue, int rowIndex, int columnIndex) {

    // Vamos alterar o valor da coluna columnIndex na linha rowIndex com o

    // valor aValue passado no parâmetro.

    // Note que vc poderia alterar 2 campos ao invés de um só.

    Venda venda = Venda.get(rowIndex);

     if (columnIndex == COL_NOME)

        venda.setNome(aValue.toString());

    if (columnIndex == COL_QUANTIDADE)

        venda.setQuantidade(aValue.toString());

    if (columnIndex == COL_DESCRICAO)

        venda.setDescricao(aValue.toString());

    if (columnIndex == COL_PRECO)

        con.setPreco(aValue.toString());

}



public Class<?> getColumnClass(int columnIndex) {

    // Qual a classe das nossas colunas? Como estamos exibindo texto, é

    // string.

    return String.class;

}



public boolean isCellEditable(int rowIndex, int columnIndex) {

    // Indicamos se a célula da rowIndex e da columnIndex é editável. Nossa

    // tabela toda é.

    return true;

}

public void delete(int row){

    venda.remove(row);

    fireTableRowsDeleted(row,row);



}

public void add(Venda v){

    Venda.add(v);//adiciona o novo contato no modelo

    this.fireTableRowsInserted(venda.size()-1,venda.size()-1);

}







// Já que esse tableModel é de contatos, vamos fazer um get que retorne um

// contato inteiro.

// Isso elimina a necessidade de chamar o getValueAt() nas telas.

public Venda get(int row) {

    return venda.get(row);

}

}[/code]

public void actionPerformed(ActionEvent evt){
Venda venda = new Venda();
venda.setValor(valotTextField.getText());
ContatoTableModel model = (ContatoTableModel) jTable.getModel();
model.add(venda);
}

Ai Marky, eu digitei um valor no TextField e clique no botão incluir que contem o método que você me passo, ai ta dando o seguinte erro.
Outra coisa, o usuário pode quere inserir vários nomes dentro dessa JTable, como eu faço???

Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: javax.swing.table.DefaultTableModel cannot be cast to Apresentacao.ContatoTableModel at Apresentacao.KK.incluirActionPerformed(KK.java:108) at Apresentacao.KK.access$000(KK.java:21) at Apresentacao.KK$1.actionPerformed(KK.java:67) at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995) at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318) at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387) at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242) at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236) at java.awt.Component.processMouseEvent(Component.java:6038) at javax.swing.JComponent.processMouseEvent(JComponent.java:3260) at java.awt.Component.processEvent(Component.java:5803) at java.awt.Container.processEvent(Container.java:2058) at java.awt.Component.dispatchEventImpl(Component.java:4410) at java.awt.Container.dispatchEventImpl(Container.java:2116) at java.awt.Component.dispatchEvent(Component.java:4240) at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4322) at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3986) at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3916) at java.awt.Container.dispatchEventImpl(Container.java:2102) at java.awt.Window.dispatchEventImpl(Window.java:2429) at java.awt.Component.dispatchEvent(Component.java:4240) at java.awt.EventQueue.dispatchEvent(EventQueue.java:599) at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:273) at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183) at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:173) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:168) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:160) at java.awt.EventDispatchThread.run(EventDispatchThread.java:121)

cara…na hora que tu instanciar o teu JTable, passa uma instancia de ContatoTableModel:

JTable table = new JTable(new ContatoTableModel());

Assim a tua JTable ira ficar com uma istancia do teu table model, e nao com a do default table model.

Abraco

[quote=Fernando Generoso da Rosa]cara…na hora que tu instanciar o teu JTable, passa uma instancia de ContatoTableModel:

JTable table = new JTable(new ContatoTableModel());

Assim a tua JTable ira ficar com uma istancia do teu table model, e nao com a do default table model.

Abraco[/quote]
Deu errado cara,agora ainda de corrigir esse erro que citei acima, também tenho que implementar uma solução para o usuário inserir vários nomes na JTable :cry:
que é coisa que eu não sei…

Posta o codigo inteiro ai da tua classe, onde tu instancia a jtable…

Pois é, você viu minha dúvida no início do tópico???
Que classe você quer???
eu to tentando implementar o método que o MArky me passo para inserir o nome na JTable após o usuário digitar o nome no TextField e clicar no botão incluir

Estou trabalhando com o visual Editor do NetBenns…

a classe visual, onde tem a jtable

Pra que você quer essa classe, sendo que o problema ta no método que eu to tentando implementar…???

Cade o código que coloca os dados dentro da sua JTable?

Pelo visto voce esta usando o DefaultTableModel. Voce precisa trabalhar com o TableModel que voce criou, com ele será possivel fazer o que voce quer.

Marky, vou postar o meu método incluir, onde o usuário digita um nome no textfield e clica no botao incluir e o nome aparece na JTable, mas tem um problema com esse método que eu criei, por que toda vez que o usuário clicar no botão incluir, ele faz uma instancia da TableModel e lança o nome dentro dela, e seta o modelo na JTable, caso o usuário queira inserir mais de um nome na JTable, ele clica no botão incluir e o dado é sobrescrevido, por que será criada outra instancia da JTable, o certo sería , cada vez que o usuário digita-se um nome no textfield e clica-se no botão incluir, tinha que ir aparecendo os nomes dentro da JTable, eu queria resolver esse problema… mas não to conseguindo, ja pesquisei na internet, mas não achei solução… :cry:

MÉTODO QUE INCLUI NA JTABLE

[code]private void incluirActionPerformed(java.awt.event.ActionEvent evt) {

    if(evt.getSource() == incluir){

      

        List<Contato> minhaLista = new ArrayList<Contato>();

         Contato contato = new Contato(recebe_nome.getText());

         minhaLista.add(contato);



        ModelTeste modelo = new ModelTeste(minhaLista);

        tabela.setModel(modelo);

   }

}[/code]

A resposta que voce quer está na sua pergunta.

Voce nao precisa ficar instanciando toda hora o TableModel. Instancie uma vez, coloque-o na tabela, depois disso, toda alteração faz com a mesma instancia.

Certo, mas como eu vo instanciar-la, sendo que durante sua instancia ele pede uma lista???
Eu estou utilizando o Visual Editor do netbens

Horas, mude seu TableModel para não receber uma Lista ou então passe uma lista vazia.

Depois disso voce só vai adicionar itens pelo método add pela ação.

[quote=Marky.Vasconcelos]Horas, mude seu TableModel para não receber uma Lista ou então passe uma lista vazia.

Depois disso voce só vai adicionar itens pelo método add pela ação.[/quote]
Como meu TableModel ficaría para caso ele não recebe-se uma lista??? ou como passar uma lista vazia pra ele???

Ai Marky, eu criei um método para instanciar a JTable… que foi esse…
Como eu estou utilizando o VisualEditor do NetBeans… ele vai junto com o initComponent(), para ser instanciado em tempo de execução…
ESSE É O MÉTODO

private void instanciaModel(){ List<Contato> lista = null; ModelTeste modelo = new ModelTeste(lista); tabela.setModel(modelo); }

Ai eu editei o método de incluir na JTable, ele fico da seguinte maneira…

[code]private void incluirActionPerformed(java.awt.event.ActionEvent evt) {
if(evt.getSource() == incluir){

        Contato contato = new Contato(recebe_nome.getText());
        ModelTeste model = (ModelTeste)tabela.getModel();
        model.add(contato);
   }
 }

[/code]
Mas quando vou compilar aparece o seguinte erro…

xception in thread "AWT-EventQueue-0" java.lang.NullPointerException at java.util.ArrayList.<init>(ArrayList.java:131) at Apresentacao.ModelTeste.<init>(ModelTeste.java:18) at Apresentacao.KK.instanciaModel(KK.java:182) at Apresentacao.KK.<init>(KK.java:30) at Apresentacao.KK$3.run(KK.java:159) at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209) at java.awt.EventQueue.dispatchEvent(EventQueue.java:597) at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:273) at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183) at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:173) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:168) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:160) at java.awt.EventDispatchThread.run(EventDispatchThread.java:121)

Será por que desse Erro??? :frowning: