Dúvidas envolvendo a Tela vendas com JTable

30 respostas
A

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…

30 Respostas

Fernando_Generoso_da

Aconselho a vc estudar duas coisas:

  • ActionListener
  • Padrao Observer

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

A

Fernando Generoso da Rosa:
Aconselho a vc estudar duas coisas:

  • ActionListener
  • Padrao Observer

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


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…

Marky.Vasconcelos

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.

A
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..
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);

    }

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

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)

Fernando_Generoso_da

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

A

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


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…

Fernando_Generoso_da

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

A

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…

Fernando_Generoso_da

a classe visual, onde tem a jtable

A

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

Marky.Vasconcelos

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.

A

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
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);

       }

}
Marky.Vasconcelos

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.

A

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

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.

A

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.


Como meu TableModel ficaría para caso ele não recebe-se uma lista??? ou como passar uma lista vazia pra ele???

A
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..
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);
       }
     }
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???? :(

Marky.Vasconcelos

Uma lista ‘null’ nao é uma lista vazia, é uma lista que não existe.

O correto para criar o Model seria.

List<Contato> lista = new ArrayList<Contato>();   
 ModelTeste modelo = new ModelTeste(lista);
A

[b]Ai Marky, vlw cara, deu certinho!!!
Qualquer coisa eu aviso blz???

Obrigado!!![/b] :mrgreen:

A
Ai Marky, eu tentei fazer uma coisa mais profissional aqui, o usuário vai digitar o nome no TextField e vai clicar no botão incluir, inves de add esse nome na Table, fazer uma busca no banco e add na JTable tudo referente a aquele nome, mas ele poderia buscar mais de um nome e add na JTable, desse mesmo jeito que tava antes.. como sería??? Meu método que busca no banco é esse ..
public List&lt;Contato&gt; buscar(String nome) throws SQLException{

        Connection conn = Conexao.getConexao();

        // Nesta Rotína, nescessita de utilizar o contrutor
        // para inicializa-lo com o parametro de deseja consultar
	        Contato contato = new Contato(nome);

                String sql = "Select * from usuario where nome=?";
		PreparedStatement stmt = conn.prepareStatement(sql);
		stmt.setString(1, contato.getNome());
		ResultSet rs = stmt.executeQuery();

		 List&lt;Contato&gt; listar= new ArrayList&lt;Contato&gt;();

		while(rs.next()){


			Contato cont = new Contato(rs.getInt("idusuario"));
                        cont.setNome(rs.getString("nome"));
                        cont.setIdade(rs.getString("idade"));
                        cont.setTelefone(rs.getString("telefone"));
			listar.add(cont);

		 }
		 rs.close();
		 stmt.close();
		 return listar;
      }
Marky.Vasconcelos

Não entendi sua dúvida.

A

É assim, o textfield vai ser considerado um campo pra buscas, o usuário irá digitar um possível nome para realizar a busca, caso o nome exista, todos os dados referente aquele nome serão lançados na JTable, a cada vez que o usuário realizar uma busca, os dados terão de ser inseridos na JTable, sem sobrescrever… é quase igual a esse outro i, a diferença é que será realizado uma consulta no banco, antes de inserir na JTable, mas poderam ser inseridos mais de um campo na tabela, ou seja, várias buscas poderam ser feitas, e os dados da JTable não poderam ser Sobrescritos…

O método que busca os dados no banco é esse ai que citei acima…
Obrigado!!

Marky.Vasconcelos

Horas, se for o que eu entendi, voce tem duas soluções.
Altere seu TableModel para aceitar uma List estilo addAll e adicione todos os itens da List dentro do seu model, ou então faça um for no evento e adicione no model um por um dos resultados.

A

A cada busca que o usuáio fazer no banco, a JTable irá receber os dados referente a busca… se for realizada mais de uma busca, todas elas terão que estar contidas na JTable…
Essa sua segunda solução eu achei mais viável para o meu problema…como sería um código fonte dela…???
Tentei mais não to conseguindo visualizar!!!

Marky.Vasconcelos

Seria mais ou menos assim:

private void incluirVariosActionPerformed(java.awt.event.ActionEvent evt) {                                        
            List<Contato> list = new DAO.buscar(recebe_nome.getText());
            ModelTeste model = (ModelTeste)tabela.getModel();
for(Contato contato : list)
            model.add(contato);
}

Se voce criar o método addAll no TableModel voce faria algo assim.

private void incluirVariosActionPerformed(java.awt.event.ActionEvent evt) {                                        
            List<Contato> list = new DAO.buscar(recebe_nome.getText());
            ModelTeste model = (ModelTeste)tabela.getModel();
            model.addAll(list);
}

Acho a segunda opção mais interessante, voce tem um model semelhante a uma List que é facil de manipular. E esse método no TableModel será bem simples.

A

Certo Marky, por enquanto eu estou sem tempo por que estou fazendo estágio, mas assim que sair um tempinho eu vo codificar e testar pra ver se deu certinho… por enquanto eu não vou colocar [RESOLVIDO] no tópico Oks??

Marky.Vasconcelos

Sem problemas, tópico “[RESOLVIDO]” é duvida resolvida, quando não lhe restarem mais fique a vontade para mudar.

A

Ok…Obrigado!!! :mrgreen:

Criado 31 de julho de 2010
Ultima resposta 4 de ago. de 2010
Respostas 30
Participantes 3