[RESOLVIDO] Evento MouseClicked

Ola Boa noite!!

Gostaria de ajuda estou tentando pegar id_cliente da minha tabela e salvar em um variável para utilizar mais a frente, so que esta apresentando erro alguem pode me ajudar segue codigo:


private void tblClientePFMouseClicked(java.awt.event.MouseEvent evt) {                                          
    atualizarTabelaClientePF();
    
    int id_cliente = Integer.parseInt(tblClientePF.getValueAt(tblClientePF.getSelectedRow(), 0).toString());
    JOptionPane.showMessageDialog(null, "Erro executasql" +id_cliente);
}

Mensagem erro:

Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: -1
	at java.util.Vector.elementData(Vector.java:734)
	at java.util.Vector.elementAt(Vector.java:477)
	at javax.swing.table.DefaultTableModel.getValueAt(DefaultTableModel.java:648)
	at javax.swing.JTable.getValueAt(JTable.java:2717)
	at View.ClientePFView.tblClientePFMouseClicked(ClientePFView.java:935)
	at View.ClientePFView.access$1000(ClientePFView.java:20)
	at View.ClientePFView$11.mouseClicked(ClientePFView.java:651)
	at java.awt.AWTEventMulticaster.mouseClicked(AWTEventMulticaster.java:270)
	at java.awt.AWTEventMulticaster.mouseClicked(AWTEventMulticaster.java:269)
	at java.awt.Component.processMouseEvent(Component.java:6536)
	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:4534)
	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:76)
	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86)
	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:76)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:728)
	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)

O método tblClientePF.getSelectedRow() retorna -1 quando não há uma linha selecionada.

ok mais como resolver isso estou meio predido.

algo como


int row = tblClientePF.getSelectedRow();
if ( row < 0 ) {
  // nada foi selecionado, manda um aviso pro usuario
} else {
  // continue sua logica 
}

getSelectedRow retorna o item na posição 0 que você clicou se clicar na tabela mas fora de alguma linha acredito que dê esse erro

provavelmente como os meninos falaram acima
O método tblClientePF.getSelectedRow() retorna -1 quando não há uma linha selecionada.

Provavelmente não, com certeza.

1 curtida

Agora eu fiquei curioso em como tratar esse erro

Para saber se tem algo selecionado na tabela você pode utilizar:
table.getSelectionModel().isSelectionEmpty()
Este método retorna true se não há nenhuma seleção na tabela, no caso você poderia negar com ! para retornar true se tiver algo selecionado.

Você fez esse código aqui:

private void tblClientePFMouseClicked(java.awt.event.MouseEvent evt) {
    atualizarTabelaClientePF();
    int id_cliente = Integer.parseInt(tblClientePF.getValueAt(tblClientePF.getSelectedRow(), 0).toString());
    JOptionPane.showMessageDialog(null, "Erro executasql" + id_cliente);
}

Que equivale a isso aqui:

private void tblClientePFMouseClicked(java.awt.event.MouseEvent evt) {
    atualizarTabelaClientePF();
    int linhaSelecionada = tblClientePF.getSelectedRow();
    Object valor = tblClientePF.getValueAt(linhaSelecionada, 0);
    int id_cliente = Integer.parseInt(valor.toString());
    JOptionPane.showMessageDialog(null, "Erro executasql" + id_cliente);
}

Então é só você verificar se realmente há uma linha selecionada:

private void tblClientePFMouseClicked(java.awt.event.MouseEvent evt) {
    atualizarTabelaClientePF();
    int linhaSelecionada = tblClientePF.getSelectedRow();
    if (linhaSelecionada != -1) {
        Object valor = tblClientePF.getValueAt(linhaSelecionada, 0);
        int id_cliente = Integer.parseInt(valor.toString());
        JOptionPane.showMessageDialog(null, "Erro executasql" + id_cliente);
    } else {
        JOptionPane.showMessageDialog(null, "Nenhuma linha selecionada");
    }
}

Agora algumas perguntas:

  • Porque a mensagem de "Erro executasql" se não ocorreu nenhum erro e nem há SQL sendo executado?

  • Porque precisa chamar o método atualizarTabelaClientePF() a cada clique?

  • Porque você está usando um MouseListener ao invés de ListSelectionListener?

3 curtidas

Muito bem explicado!

Blockquote
if (linhaSelecionada != -1) {
Object valor = tblClientePF.getValueAt(linhaSelecionada, 0);
int id_cliente = Integer.parseInt(valor.toString());
JOptionPane.showMessageDialog(null, “Erro executasql” + id_cliente);
}

  • mensagem de erro foi Ctrl+c para saber que parte do cogido tava ocorrendo erro

  • Ainda sou estudante estou aprendendo, apenas alguns teste, obrigado pela dica vou remover.

  • estou fazendo de acordo com algumas pesquisas, mais pode me falar melhor qual a diferença?

Muito obrigado resolveu o meu problema!! Vlllw :slight_smile:

A documentação pode:

1 curtida