Estou tentando fazer um carrinho de compras com base em outros códigos que eu tenho aqui, onde você escolhe os produtos, e envia pro carrinho até fechar as comprar e finalizar o carrinho.
Essa é a função de adicionar no carrinho:
public void preencherTabelaCarrinho(){
ArrayList dados = new ArrayList();
String [] colunas = new String []{"Nome","Tipo","Quantidade","Preço"};
dados.add(new Object[]{nomeProduto,tipoProduto,quantidadeProduto,valorProduto});
modeloTabela modelo = new modeloTabela(dados, colunas);
jTableCarrinho.setModel(modelo);
jTableCarrinho.getColumnModel().getColumn(0).setPreferredWidth(110);
jTableCarrinho.getColumnModel().getColumn(0).setResizable(false);
jTableCarrinho.getColumnModel().getColumn(1).setPreferredWidth(110);
jTableCarrinho.getColumnModel().getColumn(1).setResizable(false);
jTableCarrinho.getColumnModel().getColumn(2).setPreferredWidth(43);
jTableCarrinho.getColumnModel().getColumn(2).setResizable(false);
jTableCarrinho.getColumnModel().getColumn(3).setPreferredWidth(80);
jTableCarrinho.getColumnModel().getColumn(3).setResizable(false);
jTableCarrinho.getTableHeader().setReorderingAllowed(false);
jTableCarrinho.setAutoResizeMode(jTableCarrinho.AUTO_RESIZE_OFF);
jTableCarrinho.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
conex.desconecta();
}
Porém sempre que eu adiciono um produto ao carrinho ele adiciona na mesma linha que o anterior, não adiciona uma linha nova…
Por que?
o JTable exibirá o array de Object então tenta salvar os itens em um array e ao exibir na tabela onde ele esta recebendo o array de Object vc passa esse array com os itens
Se eu fosse você, criaria uma classe Carrinho, para comportar uma coleção de objetos Item.
Aí escreveria meu próprio TableModel para renderizar os Item que estão no Carrinho
Fiz conforme você sugeriu, uma nova classe para adicionar os itens ao carrinho
Para isso fiz essa função:
private void addListaCarrinho(int itensCarrinho, String nomeProduto, String tipoProduto, int quantidadeProduto, double valorProduto) {
ArrayList dados = new ArrayList();
String [] colunas = new String []{"ID", "Nome","Tipo","Quantidade","Preço"};
modeloTabela modelo = new modeloTabela(dados, colunas);
// adicionar os que já estavam
for(int i = 1; i < itensCarrinho; i++) {
String localNome = (String) jTableProdutos.getValueAt(i, 1);
String localTipo = (String) jTableProdutos.getValueAt(i, 2);
double localValor = (Double) jTableProdutos.getValueAt(i, 3);
int localEstoque = (Integer) jTableProdutos.getValueAt(i, 4);
dados.add(new Object[]{i, localNome,localTipo,localValor,localEstoque});
}
// adicionar o novo
dados.add(new Object[] { itensCarrinho, nomeProduto,tipoProduto,quantidadeProduto,valorProduto});
// ajustar a tabela
jTableCarrinho.setModel(modelo);
jTableCarrinho.getColumnModel().getColumn(0).setPreferredWidth(110);
jTableCarrinho.getColumnModel().getColumn(0).setResizable(false);
jTableCarrinho.getColumnModel().getColumn(1).setPreferredWidth(110);
jTableCarrinho.getColumnModel().getColumn(1).setResizable(false);
jTableCarrinho.getColumnModel().getColumn(2).setPreferredWidth(43);
jTableCarrinho.getColumnModel().getColumn(2).setResizable(false);
jTableCarrinho.getColumnModel().getColumn(3).setPreferredWidth(80);
jTableCarrinho.getColumnModel().getColumn(3).setResizable(false);
jTableCarrinho.getTableHeader().setReorderingAllowed(false);
jTableCarrinho.setAutoResizeMode(jTableCarrinho.AUTO_RESIZE_OFF);
jTableCarrinho.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
}
Ao clicar em adicionar ao carrinho faz uma verificação na tabela de carrinho antiga e recria ela, com um novo…
Está funcionando, agora consigo adicionar 2 produtos ao carrinho, mas quando passa de dois da erro
Exception in thread "AWT-EventQueue-1" java.lang.IndexOutOfBoundsException: Index: 2, Size: 2
at java.util.ArrayList.rangeCheck(ArrayList.java:657)
at java.util.ArrayList.get(ArrayList.java:433)
at Funcionarios.modeloTabela.getValueAt(modeloTabela.java:63)
at javax.swing.JTable.getValueAt(JTable.java:2717)
at Pedidos.telaTirarPedido.addListaCarrinho(telaTirarPedido.java:458)
at Pedidos.telaTirarPedido.preencherTabelaCarrinho(telaTirarPedido.java:379)
at Pedidos.telaTirarPedido.jButton1ActionPerformed(telaTirarPedido.java:403)
at Pedidos.telaTirarPedido.access$200(telaTirarPedido.java:21)
at Pedidos.telaTirarPedido$3.actionPerformed(telaTirarPedido.java:114)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2348)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
at java.awt.Component.processMouseEvent(Component.java:6533)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3324)
at java.awt.Component.processEvent(Component.java:6298)
at java.awt.Container.processEvent(Container.java:2236)
at java.awt.Component.dispatchEventImpl(Component.java:4889)
at java.awt.Container.dispatchEventImpl(Container.java:2294)
at java.awt.Component.dispatchEvent(Component.java:4711)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4888)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4525)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4466)
at java.awt.Container.dispatchEventImpl(Container.java:2280)
at java.awt.Window.dispatchEventImpl(Window.java:2746)
at java.awt.Component.dispatchEvent(Component.java:4711)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758)
at java.awt.EventQueue.access$500(EventQueue.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:709)
at java.awt.EventQueue$3.run(EventQueue.java:703)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:90)
at java.awt.EventQueue$4.run(EventQueue.java:731)
at java.awt.EventQueue$4.run(EventQueue.java:729)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:728)
at org.GNOME.Accessibility.AtkWrapper$5.dispatchEvent(AtkWrapper.java:700)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
Se você tem uma coleção de objetos (uma lista por exemplo) é desnecessário fazer um laço para adicionar elementos na JTable.
De uma estudada em como criar seu próprio TableModel, aqui tem um exemplo: http://www.staroski.com.br/2014/12/12/apresentar-itens-jtable/