[Resolvido] Transferir dados de um Jtable de um Jdialog para o Jtable de um JFrame

Devo ter me confundido pois vc instanciou a TelaInicialVendas no botão no primeiro poste, acho que vc queria a TelaPesquisaVendas.

@diego12 - Segue a TelaPesquisaProd , desculpe cheguei em casa agora…

package telas;

import dao.ProdutosDao;
import java.awt.Dimension;
import java.util.Vector;
import javax.sound.midi.Soundbank;
import javax.swing.JOptionPane;
import javax.swing.JTable;
import javax.swing.SwingConstants;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.JTableHeader;
import javax.swing.table.TableColumnModel;
import telas.TelaInicialVendas;

/**
*

  • @author sergio.lucas
    */
    public class TelaPesquisaVendas extends javax.swing.JDialog {

    DefaultTableModel m;

    /**

    • Creates new form TelaPesquisaVendas
      */
      public TelaPesquisaVendas(java.awt.Frame parent, boolean modal) {
      super(parent, modal);
      initComponents();

    }

    private String[] obterLinha(int indice, DefaultTableModel model) {
    String[] linha = new String[5];
    linha[0] = model.getValueAt(indice, 0).toString();
    linha[1] = model.getValueAt(indice, 1).toString();
    linha[2] = model.getValueAt(indice, 2).toString();
    linha[3] = model.getValueAt(indice, 3).toString();
    linha[4] = model.getValueAt(indice, 4).toString();
    return linha;
    }
    private void adicionarLinha(String[] linha, DefaultTableModel model) {
    model.addRow(linha);
    }

    private void Ajustacoluna() {
    jtPesqProd.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
    ((DefaultTableCellRenderer) jtPesqProd.getTableHeader().getDefaultRenderer()).setHorizontalAlignment(SwingConstants.CENTER);
    DefaultTableCellRenderer esquerda = new DefaultTableCellRenderer();
    DefaultTableCellRenderer centralizado = new DefaultTableCellRenderer();
    DefaultTableCellRenderer direita = new DefaultTableCellRenderer();
    esquerda.setHorizontalAlignment(SwingConstants.LEFT);
    centralizado.setHorizontalAlignment(SwingConstants.CENTER);
    direita.setHorizontalAlignment(SwingConstants.RIGHT);
    jtPesqProd.getColumnModel().getColumn(0).setCellRenderer(centralizado);
    jtPesqProd.getColumnModel().getColumn(1).setCellRenderer(centralizado);
    jtPesqProd.getColumnModel().getColumn(2).setCellRenderer(centralizado);
    jtPesqProd.getColumnModel().getColumn(3).setCellRenderer(centralizado);
    jtPesqProd.getColumnModel().getColumn(4).setCellRenderer(centralizado);

     jtPesqProd.getColumnModel().getColumn(0).setPreferredWidth(60);
     jtPesqProd.getColumnModel().getColumn(1).setPreferredWidth(370);
     jtPesqProd.getColumnModel().getColumn(2).setPreferredWidth(55);
     jtPesqProd.getColumnModel().getColumn(3).setPreferredWidth(70);
     jtPesqProd.getColumnModel().getColumn(4).setPreferredWidth(70);
    

    }

    @SuppressWarnings("unchecked")
    

    //
    private void initComponents() {

     jtPesq = new javax.swing.JTextField();
     jLabel1 = new javax.swing.JLabel();
     jScrollPane1 = new javax.swing.JScrollPane();
     jtPesqProd = new javax.swing.JTable();
     jLabel3 = new javax.swing.JLabel();
     jLabel2 = new javax.swing.JLabel();
     txtQtdItem = new javax.swing.JTextField();
     jButton1 = new javax.swing.JButton();
     bntAddItem = new javax.swing.JButton();
    
     setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
    
     jtPesq.setHorizontalAlignment(javax.swing.JTextField.CENTER);
     jtPesq.addKeyListener(new java.awt.event.KeyAdapter() {
         public void keyReleased(java.awt.event.KeyEvent evt) {
             jtPesqKeyReleased(evt);
         }
     });
    
     jLabel1.setText("BUSCAR");
    
     jtPesqProd.setModel(new javax.swing.table.DefaultTableModel(
         new Object [][] {
             {},
             {},
             {},
             {}
         },
         new String [] {
    
         }
     ));
     jScrollPane1.setViewportView(jtPesqProd);
    
     jLabel3.setFont(new java.awt.Font("Tahoma", 0, 24)); // NOI18N
     jLabel3.setText("PESQUISA DE PRODUTOS");
    
     jLabel2.setText("QUANTIDADE");
    
     jButton1.setText("SAIR");
     jButton1.addActionListener(new java.awt.event.ActionListener() {
         public void actionPerformed(java.awt.event.ActionEvent evt) {
             jButton1ActionPerformed(evt);
         }
     });
    
     bntAddItem.setText("Adicionar Item");
     bntAddItem.addActionListener(new java.awt.event.ActionListener() {
         public void actionPerformed(java.awt.event.ActionEvent evt) {
             bntAddItemActionPerformed(evt);
         }
     });
    
     javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
     getContentPane().setLayout(layout);
     layout.setHorizontalGroup(
         layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
         .addGroup(layout.createSequentialGroup()
             .addContainerGap()
             .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 631, Short.MAX_VALUE)
             .addContainerGap())
         .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
             .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
             .addComponent(jLabel1)
             .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
             .addComponent(jtPesq, javax.swing.GroupLayout.PREFERRED_SIZE, 501, javax.swing.GroupLayout.PREFERRED_SIZE)
             .addGap(70, 70, 70))
         .addGroup(layout.createSequentialGroup()
             .addGap(184, 184, 184)
             .addComponent(jLabel3)
             .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
         .addGroup(layout.createSequentialGroup()
             .addGap(20, 20, 20)
             .addComponent(jLabel2)
             .addGap(18, 18, 18)
             .addComponent(txtQtdItem, javax.swing.GroupLayout.PREFERRED_SIZE, 88, javax.swing.GroupLayout.PREFERRED_SIZE)
             .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
             .addComponent(bntAddItem, javax.swing.GroupLayout.PREFERRED_SIZE, 128, javax.swing.GroupLayout.PREFERRED_SIZE)
             .addGap(64, 64, 64)
             .addComponent(jButton1, javax.swing.GroupLayout.PREFERRED_SIZE, 128, javax.swing.GroupLayout.PREFERRED_SIZE)
             .addContainerGap())
     );
     layout.setVerticalGroup(
         layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
         .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
             .addComponent(jLabel3)
             .addGap(29, 29, 29)
             .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                 .addComponent(jtPesq, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                 .addComponent(jLabel1))
             .addGap(18, 18, 18)
             .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 338, javax.swing.GroupLayout.PREFERRED_SIZE)
             .addGap(18, 18, 18)
             .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                 .addComponent(jButton1, javax.swing.GroupLayout.PREFERRED_SIZE, 41, javax.swing.GroupLayout.PREFERRED_SIZE)
                 .addComponent(txtQtdItem, javax.swing.GroupLayout.PREFERRED_SIZE, 29, javax.swing.GroupLayout.PREFERRED_SIZE)
                 .addComponent(jLabel2)
                 .addComponent(bntAddItem, javax.swing.GroupLayout.PREFERRED_SIZE, 41, javax.swing.GroupLayout.PREFERRED_SIZE))
             .addContainerGap(20, Short.MAX_VALUE))
     );
    
     pack();
    

    }//

    private void jtPesqKeyReleased(java.awt.event.KeyEvent evt) {
    Vector cabecalho = new Vector();
    cabecalho.add("Código ");
    cabecalho.add(“Descrição”);
    cabecalho.add(“Peso”);
    cabecalho.add(“Valor”);
    cabecalho.add(“Estoque”);

     ProdutosDao dao = new ProdutosDao();
     if (!jtPesq.getText().equals("")) {
    
         DefaultTableModel dtm = new DefaultTableModel(dao.consultaProdutos(jtPesq.getText()), cabecalho);
         jtPesqProd.setModel(dtm);
         Ajustacoluna();
    
     } else {
         DefaultTableModel dtm = new DefaultTableModel(new Vector(), cabecalho);
         jtPesqProd.setModel(dtm);
         Ajustacoluna();
     }
    
     // TODO add your handling code here:
    

    }

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
    this.dispose();
    // TODO add your handling code here:
    }

    private void bntAddItemActionPerformed(java.awt.event.ActionEvent evt) {
    int fsel = jtPesqProd.getSelectedRow();
    try {
    String idProd, nomeProd, pesoProd, valorProd, estoque, qtdProd, importar;
    Double valor;

         if (fsel == -1) {
    
             JOptionPane.showMessageDialog(null, "Você deve Selecionar um Produto", "Advertência", JOptionPane.WARNING_MESSAGE);
         } else {
             
             String[] linha = obterLinha(fsel, (DefaultTableModel)jtPesqProd.getModel());
    TelaInicialVendas tela = new TelaInicialVendas();
    adicionarLinha(linha, (DefaultTableModel)(tela.jtItensVenda.getModel()));
    
             
    
         }
    
     } catch (Exception e) {
     }
    
     // TODO add your handling code here:
    

    }

    /**

    • @param args the command line arguments
      /
      public static void main(String args[]) {
      /
      Set the Nimbus look and feel /
      //
      /
      If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.

      • For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
        */
        try {
        for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
        if (“Nimbus”.equals(info.getName())) {
        javax.swing.UIManager.setLookAndFeel(info.getClassName());
        break;
        }
        }
        } catch (ClassNotFoundException ex) {
        java.util.logging.Logger.getLogger(TelaPesquisaVendas.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
        java.util.logging.Logger.getLogger(TelaPesquisaVendas.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
        java.util.logging.Logger.getLogger(TelaPesquisaVendas.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
        java.util.logging.Logger.getLogger(TelaPesquisaVendas.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //

      /* Create and display the dialog */
      java.awt.EventQueue.invokeLater(new Runnable() {
      public void run() {
      TelaPesquisaVendas dialog = new TelaPesquisaVendas(new javax.swing.JFrame(), true);
      dialog.addWindowListener(new java.awt.event.WindowAdapter() {
      @Override
      public void windowClosing(java.awt.event.WindowEvent e) {
      System.exit(0);
      }
      });
      dialog.setVisible(true);
      }
      });
      }

    // Variables declaration - do not modify
    private javax.swing.JButton bntAddItem;
    private javax.swing.JButton jButton1;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JTextField jtPesq;
    public javax.swing.JTable jtPesqProd;
    private javax.swing.JTextField txtQtdItem;
    // End of variables declaration
    }

verdade, não sei qual o motivo de eu ter instanciado essa Tela. :open_mouth:

Vou refazer esse código novamente, vi um video onde é feito a passagem de um Jtable de uma Jdialog para um Jtable de um Jframe, e não tem nada de diferente do que estou fazendo…
vou criar um projeto especifico só para fazer essa passagem, em seguida se funcionar, implemento no meu projeto de Vendas. :weary:

Acho que encontrei o problema, na tela de pesquisa vc adicionou um evento de pressionar algum botão que troca o DefaultTableModel da tabela substituindo os dados, parece que esse evento é chamado após pressionar “F1” em que a tela abre, não consegui identificar ao certo o motivo de da execução, vc pode fazer um teste:

Na tela inicial:

     case "F1": {
         TelaPesquisaVendas telapesq = new TelaPesquisaVendas(null, true);
         String[] linha = obterLinha(jtItensVenda.getSelectedRow() , (DefaultTableModel)jtItensVenda.getModel());
         adicionarLinha(linha, (DefaultTableModel)(telapesq.jtPesqProd.getModel()));             telapesq.setVisible(true);
     }

e

private String[] obterLinha(int indice, DefaultTableModel model) {
    String[] linha = new String[5];
    linha[0] = model.getValueAt(indice, 0).toString();
    linha[1] = model.getValueAt(indice, 1).toString();
    linha[2] = model.getValueAt(indice, 2).toString();
    linha[3] = model.getValueAt(indice, 3).toString();
    linha[4] = model.getValueAt(indice, 4).toString();
    return linha;
}

private void adicionarLinha(String[] linha, DefaultTableModel model) {
    model.addRow(linha);
}

Na tela de pesquisa, altere as propriedades da tabela pelo netbeans, inserindo as colunas e removendo os itens inicias:

"Código ", "Descrição", "Peso", "Valor", "Estoque" // colunas

depois remova o keyListener da tabela, também nas propriedades (mantenha uma cópia do código antes de fazer a alteração).

@diego12
Veja bem é aberta a TelaInicialVendas, para procurar um produto a tecla F1 é pressionada ,em seguida é carregada a TelaPesquisaVendas , já na Jtable é adicionado o cabeçalho que vai receber os dados do Banco de dados, que seria o Código, Nome, Peso, Valor e Estoque, então já deixei o titulo das colunas identificadas, para quando for puxar do banco já está com o titulo.
Criei um metódo para ajustar o tamanho das colunas, pois algumas precisam de mais espaço do que as outras , por isso fiz esse método.
A respeito das alterações, se eu colocar no Case F1 o código que você mencionou que é no TelainicialVendas eu teria que deixar o Setvisible(true) e o setModal(true) que já está no meu código? pois eu fiz isso e não carrega ao pressionar F1, também foi instanciado no Case F1, um Frame get Parent é responsável por deixar a tela em evidência se não me engano quando eu retiro não abre também o F1 ou seja é necessário.
Em relação aos métodos que você citou eu deixo ele na telaInicialVendas? pois você havia dito para deixar no TelaPesquisaVendas, caso seja lá eu tenho que instanciar e chamar eles no TelaInicial, eu coloquei os metódos obterlinha e AdicionarLinha em Público e chamei apartir do Tela inicial, de qualquer forma não funcionou… talvez não esteja fazendo correto.
É como se a Tabela da Tela inicial não fosse inicializada, se é que isso seria o termo possível de se chamar.
Eu não entendo tanta dificuldade, não sei pelo fato de eu colocar esse código para chamar através do F1, como eu falei eu vi o video de um americano que fez o tutorial ensinando, está basicamente do mesmo jeito, que a lógica que estamos usando… e ele também usa um Jdialog para jogar no Jframe, eu fiz do mesmo jeito dele o código e não funcionou… estou pensando em fazer um projeto especifico só para aprimorar isso depois jogar para o meu projeto e fazer como ele está mencionando no video que é próximo ao que relatou.

:weary:

Calma, uma coisa de cada vez, primeiro tentar passar os valores de um Table para outro. Se tentar fazer tudo funcionando de uma vez, não vai conseguir, o problema é que vc está substituindo o TableModel na tela da pesquisa.

Não, o cabeçalho precisa ser adicionada quando instancia a classe dentro do initComponents. Além disso é preferencial ter apenas um TableModel, naquele método está substituindo.

Não, serve para deixar centralizado e avisar o dialog quem é o antecessor, pode passar nulo para teste.

Sim, pode deixar nos dois se quiser, serve só para organizar o código, também pode substituir se quiser por outro equivalente.

Ela é iniciada, só que vazia, precisa atualizar isso nas propriedades da tabela pelo modo Design do Netbeans.

Eu refiz aqui como descrito mas com algumas modificações pois não tenho o BD:
TelaInicialVendas.java (21,3 KB)
TelaPesquisaVendas.java (9,9 KB)

@diego12

A Respeito do seu Código vamos a algumas comparações:

1º No Código que eu havia feito (e enviado para você), o usuário entra na Tela inicial e a Jtable (jtItensVenda) está vazia, ao pressionar F1 é chamado o JDialog (TelaPesquisaVendas), nesse Jdialog tem uma Jtextfield eu coloco apenas uma letra, e ele automaticamente busca no banco de Dados e mostra na Jtable (jtPesqVenda) desse Jdialog (TelaPesquisaVendas), após encontrar o produto, é só clicar nessa linha desse Jtable (jtPesqVendas) e clicar em Adicionar Item, logo essa linha ou seja produto selecionado deve aparecer no Jtable (jtItensVendas) do Jframe (Tela Inicial).

No Seu código, os produtos já estão armazenados na Jtable(jtItensVendas) da Jframe(TelaInicialVendas), e quando pressionamos “F1” não acontece nada, porém se clicar em algum item que você cadastrou e pressionar F1, essa linha selecionada é enviada para Jtable (jtPesqVendas) da Jdialog (TelaPesquisaVendas). Isso está ao contrário do que planejava.

Creio que estamos quase lá, talvez eu deva adaptar o processo inverso. primeiramente o F1 deve chamar a Jdialog sem clicar em nada, afinal esse é o objetivo procurar o item de deseja adicionar para efetuar a venda.

Talvez eu não tenha explicado corretamente como seria esse procedimento.

TelaInicialVendas.java (21,0 KB)
TelaPesquisaVendas.java (10,0 KB)
Esperando que seja isso:

Na telaInicial:

-Evento pressionar F1

 @Override
 public void actionPerformed(ActionEvent ae) {
     switch (tecla) {
     case "F1": {
             TelaPesquisaVendas telapesq = new TelaPesquisaVendas(TelaInicialVendas.this, true);
             telapesq.setVisible(true);
         }
     }
 }
}

O TelaInicialVendas.this retorna a instancia da Tela.

public Object[] obterLinha(int indice, DefaultTableModel model) {
    Object[] linha = new Object[5];
    linha[0] = model.getValueAt(indice, 0);
    linha[1] = model.getValueAt(indice, 1);
    linha[2] = model.getValueAt(indice, 2);
    linha[3] = model.getValueAt(indice, 3);
    linha[4] = model.getValueAt(indice, 4);
    return linha;
}
public void adicionarLinha(Object[] linha) {
    adicionarLinha(linha, (DefaultTableModel)jtItensVenda.getModel());
}
public void adicionarLinha(Object[] linha, DefaultTableModel model) {
    model.addRow(linha);
}

Mudei para object pois é melhor, adicionei outro método e tornei public para a pesquisa acessar

Na Tela Pesquisa:

private void bntAddItemActionPerformed(java.awt.event.ActionEvent evt) {
int fsel = jtPesqProd.getSelectedRow();
try {
// String idProd, nomeProd, pesoProd, valorProd, estoque, qtdProd, importar;
Double valor;
     if (fsel == -1) {

         JOptionPane.showMessageDialog(null, "Você deve Selecionar um Produto", "Advertência", JOptionPane.WARNING_MESSAGE);
     } else {
           TelaInicialVendas inicial = (TelaInicialVendas)getParent(); // o parent é a tela inicial
           inicial.adicionarLinha(obterLinha(jtPesqProd.getSelectedRow(), (DefaultTableModel)jtPesqProd.getModel()));
     }

 } catch (Exception e) {
 }

e troquei para public e object também

public Object[] obterLinha(int indice, DefaultTableModel model) {
    Object[] linha = new Object[5];
    linha[0] = model.getValueAt(indice, 0);
    linha[1] = model.getValueAt(indice, 1);
    linha[2] = model.getValueAt(indice, 2);
    linha[3] = model.getValueAt(indice, 3);
    linha[4] = model.getValueAt(indice, 4);
    return linha;
}

public void adicionarLinha(Object[] linha, DefaultTableModel model) {
    model.addRow(linha);
}
1 curtida

@diego12

Funcionou Diego! :grinning:
Então as alterações que você fez foi colocar o Object[] ao invés do String[] e tornar público os métodos.

Gostaria de fazer duas perguntas:
1º Temos o mesmo método na TelaInicialVendas e TelaPesquisaVendas… eles enviam os dados de uma para o outro? essa parte eu não entendi.

2º A primeira linha da minha Jtable está ficando em branco (Ou seja sem registro) logo ao abrir, como eu removo essa linha para não aparecer, fui no conteúdo da tabela e não é mostrado nenhuma linha, pelo que eu vi no inicialize também não detectei nada que pudesse chamar a linha em branco. No seu código essa linha em branco.

Desde já agradeço o empenho e a ajuda na resolução desse problema, havia parado o desenrolar do projeto por causa desse item.

Agora precisa arrumar algumas coisas:

Remova aqueles métodos de adicionarLinha e obterLinha, pois só são métodos de testes.

Na tela pesquisa, no adicionar item substitua por:

// obtem a tela inicial
TelaInicialVendas inicial = (TelaInicialVendas) getParent();

// separa os dados para tranferir
String idProd, nomeProd, pesoProd, valorProd, estoque, qtdProd, importar;
idProd = jtPesqProd.getValueAt(linha, 0).toString();
nomeProd = jtPesqProd.getValueAt(linha, 1).toString();
pesoProd = jtPesqProd.getValueAt(linha, 2).toString();
valorProd = jtPesqProd.getValueAt(linha, 3).toString();
// TODO
// estoque = jtPesqProd.getValueAt(linha, 4).toString(); // desnecessario no momento

// envia para a outra janela
inicial.adicionarProduto(idProd, nomeProd, pesoProd, valorProd, quantidade);

Isso é bem similar ao que vc tinha feito, acredito que o estoque não é importante ser enviado para a outra tabela, mas se for coloque também no parâmetro, a quantidade vem do textField da tela.

Adicione na tela inicial:

public void adicionarProduto(String idProd, String pesoProd, String valorProd, int quantidade) {
    DefaultTableModel model = (DefaultTableModel) jtItensVenda.getModel();
    Object[] linha = new Object[5]; // cria a linha
    linha[0] = idProd;
    linha[1] = nomeProd;
    linha[2] = pesoProd;
    linha[3] = valorProd;
    linha[4] = quantidade;
    model.addRow(linha);
}

Similar ao adicionar linha, a diferença são os parâmetros.

Fazer dessa forma é melhor e mais seguro do que adicionarLinha e obterLinha.

Após as modificações fica mais fácil de entender, a Tela Pequisa conhece a Inicial porque é passada por parâmetro no construtor. No evento do botão adicionar, recupera a janela e transfere usando o método adicionarProduto, que atualiza a tabela.

É um erro de configuração, em alguma propriedade da tabela, não tenho Netbeans aqui, então não sei exatamente como resolver. Em algum lugar, no modo design, clicando com botão direito do mouse e em alguma propriedade, é possível remover essa linha.

1 curtida

Certo @diego12, farei as modificações e procurarei de onde está vindo esse erro.

Acabei de encontrar o Erro :slight_smile:

Na Jtable havia um espaço branco entre chaves que estava ocasionando a linha indesejada.

Obrigado @diego12 pela paciência em me ajudar!

Pronto @diego12, concluí as modificações e aproveitei já para forçar o usuário digitar a quantidade, eu até coloquei no principio para ele calcular o valor digitado com a quantidade do estoque, porém eu verifiquei que se eu colocar o valor todo, ou seja, por exemplo ser tiver 20 produtos e na busca eu selecionar e colocar 20 a quantidade, se eu selecionar novamente para buscar ainda mostrará que está com 20 unidades, ou seja, acho melhor deixar para conferir isso quando for finalizar a venda, pois não posso fazer o update no banco sem antes finalizar a venda, pois caso o usuário não queira o produto podemos retirar o item.

Agradeço pela ajuda mais uma vez.
Creio que daqui para o término de projeto surgirá novas dúvidas.
Caso não consiga resolver postarei no GUJ, me esforçarei em tentar resolver o máximo que der.