Tabela Jtable

Erro – Selecao tabela Java

Pessoal, preciso de ajuda pra resolver esse ‘pepino’
Estou recebendo um conhecido ‘velho’ erro que não se encaixou nas diversas soluções de correção já apontadas.

Exception in thread “AWT-EventQueue-0” java.lang.ArrayIndexOutOfBoundsException: 1 >= 1
Etc, etc etc…

Ocorre quando eu seleciono um item da tabela (Jtable) preenchida, que NÃO seja o primeiro item.

Tabela gerada:

O erro está ocorrendo, como nesse exemplo, quando seleciono o Segundo item e mando preencher os campos relativos na tela.

Se eu selecionar um Terceiro, e outros, também receberei a mensagem. Só muda o final 3 >= 1

Exception in thread “AWT-EventQueue-0” java.lang.ArrayIndexOutOfBoundsException: 2 >= 1

Na minha tela, eu faço uso de duas tabelas a serem preenchidas:
image

Um fato estranho, é que, mesmo dando o erro, os dados na tela são preenchidos corretamente mas os ‘return codes’ ficam todos comprometidos e as instruções de result codes, não funcionam mais.

Por que dá o ‘estouro’ no array?
Por que só funciona quando seleciono o primeiro item?

Agradeço vossa analise, obrigados.

Segue a listagem resumida da classe:

private void consulta_patri()
{
String sql=“select * from dados where num_patrim = ? order by num_patrim”;
try {
pst = conexao.prepareStatement(sql);
pst.setString(1, (String) cmbSerial.getSelectedItem());
rs=pst.executeQuery();
if (rs.next()) { }
else {
JOptionPane.showMessageDialog(null, “Num patrimonio não existe”); }
// a linha abaixo, usa a biblioteca rs2xml.jar para preencher a tabela
rs=pst.executeQuery();

    TblClientes.setModel(DbUtils.resultSetToTableModel(rs));
    TblClientes.getColumnModel().getColumn(0).setPreferredWidth(50);
    TblClientes.getColumnModel().getColumn(1).setPreferredWidth(80);

         (tem mais campos, tirei pra nao poluir  muito esse texto)...............

    TblClientes.setRowSelectionAllowed(true);
    TblClientes.getTableHeader().setReorderingAllowed(true);        

      } catch (Exception e) { e.printStackTrace();
        JOptionPane.showMessageDialog(null, e); }

}

// inicio do metodo preencher os dados do formulario
public void setar_campos()
{
// ------ rotina check se a linha foi selecionada
DefaultTableModel dtm = (DefaultTableModel)TblClientes.getModel();
if (TblClientes.getSelectedRow() >= 0){
}else{
JOptionPane.showMessageDialog(null, “Favor selecionar uma linha”);
return; }

// ----- rotina preenche os campos da tela

int setar = TblClientes.getSelectedRow();
txtSerie.setText(TblClientes.getModel().getValueAt(setar,1).toString());
txtPatrim.setText(TblClientes.getModel().getValueAt(setar,2).toString());
txtMarca.setText(TblClientes.getModel().getValueAt(setar,3).toString());
txtModelo.setText(TblClientes.getModel().getValueAt(setar,4).toString());
txtSetor.setText(TblClientes.getModel().getValueAt(setar,7).toString());
txtUsuario.setText(TblClientes.getModel().getValueAt(setar,8).toString());
txtSoftware.setText(TblClientes.getModel().getValueAt(setar,12).toString());
txtTipo.setText(TblClientes.getModel().getValueAt(setar,5).toString());

} // ----- FIM DO PUBLIC VOID SETAR CAMPOS ------

// ----- INICIO DO METODO DO BOTAO PROCURA SOFTWARE
private void consulta_software()
{

 String sql="select * from softwares where nome_soft = ? order by nome_soft";

try {
pst = conexao.prepareStatement(sql);
pst.setString(1, (String) cmbSoftware.getSelectedItem());
rs=pst.executeQuery();
// a linha abaixo, usa a biblioteca rs2xml.jar para preencher a tabela

    TblClientes2.setModel(DbUtils.resultSetToTableModel(rs));
    TblClientes2.getColumnModel().getColumn(0).setPreferredWidth(50);
    TblClientes2.getColumnModel().getColumn(1).setPreferredWidth(80);
            (tem mais campos, tirei pra nao poluir  muito esse texto).....
    TblClientes2.setRowSelectionAllowed(true);
    TblClientes2.getTableHeader().setReorderingAllowed(true);        

} catch (Exception e) { e.printStackTrace(); // — CATCH DO TRY DO SQL CONSULTA SOFTWARE
JOptionPane.showMessageDialog(null, e);
}
} // ---- FIM DO PRIVATE VOID CONSULTA SOFTWARE()

// ---------- INICIO DO METODO PREENCHER OS DADOS DO FORMULARIO DE SOFTWARE
public void setar_campos2()
{
// ------ rotina check se a linha foi selecionada

DefaultTableModel dtm2 = (DefaultTableModel)TblClientes2.getModel();
 int setar2 = 0;       
    if (TblClientes2.getSelectedRow() >= 0){
     setar2 = TblClientes2.getSelectedRow();
           }else{
        
         setar2 = TblClientes2.getSelectedRow();
           JOptionPane.showMessageDialog(null, "Favor selecionar uma linha");
        return;
         }
   
txtSoftAssoc.setText(TblClientes2.getModel().getValueAt(setar2,1).toString());
txtReleaseSoft.setText(TblClientes2.getModel().getValueAt(setar2,2).toString());

concate = TblClientes2.getModel().getValueAt(setar2,1).toString()
         +TblClientes2.getModel().getValueAt(setar2,2).toString()
         +TblClientes.getModel().getValueAt(setar2,2).toString();

}

Pessoal, resolvido. O problema era quando eu tentava fazer o ‘concate’, estava definido errado, Eu tentava juntar/achar um campo que estava na outra tabela…

Vamos por partes.
O primeiro problema (e, provavelmente, o causador dos demais) é este:

É muito, mas muito fácil criar o seu próprio table model customizado (e funcional). Por que insistir nessa merda? (Ops, não sei se pode escrever merda, mas, já foi).

Você conhece os detalhes do funcionamento do DefaultTableModel? Sabe como ele opera “por baixo dos panos”? Se não sabe, então por que insiste em usar isso aí?

“Ah, mas é que tem disponível, é fácil, prático, blábláblá e mimimi”.
Sim, java também tem uma keyword chamada goto. Você já usou? Se não, por que ainda não?
“Ah, por que nunca precisei”.
Sim, assim como você não precisa dessa desgraça.
“Ah, mas deve ser difícil criar um table model customizado”.
Será mesmo?

Após essa breve introdução, qual a mensagem de erro completa? Em qual linha é acusado o ArrayIndexOutOfBoundsException?

1 curtida

Pois é, pastei um bom tempo no erro que foi causado por uma bobeira minha…

O erro era causado porque eu queria pegar um dado da primeira tabela definida como:

int setar = TblClientes.getSelectedRow();

txtPatrim.setText(TblClientes.getModel().getValueAt(setar,2).toString());

E eu estava querendo concatenar com dados da segunda tabela, assim:
`
concate = TblClientes2.getModel().getValueAt(setar2,1).toString()
+TblClientes2.getModel().getValueAt(setar2,2).toString()
+TblClientes.getModel().getValueAt(setar2,2).toString();

O erro: Estava usando ( setar2, 2 ) quando deveria ser (setar,2) `` `

Aquele ditado: ‘Quem procura o que não existe, quando acha, Não encontra !!!’
obs: gostei da dica do ‘goto’, vou pesquisar.
obrigado pela atenção.

Cara, não é pra usar, nem goto, nem DefaultTableModel.

1 curtida

Vichi, entendi errado… Go to era muito usado em programação procedural (rsss. Vicio antigo…Lá se vão os tempos de Cobol… valeu.