Bug JTable ao clicar em uma linha [RESOLVIDO]

Bom dia a todos,

Eu tenho um JTable em minha aplicação, onde eu exibo registros do banco de dados e tal, e nessa JTable tem um botão que eu removo as “linhas” (na verdade removo do banco e dou um refresh no JTable).

Pois bem, o bug está quando eu excluo o último elemento do JTable, ou seja, supondo que eu tenho 4 linhas, se eu deletar a 1 depois a 2, …3, …4 ele funciona certinho, mas se eu deletar a 4 primeiro, depois quando eu clicar em qualquer parte do JTable, ele da esta excessão.

Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 4 >= 4 at java.util.Vector.elementAt(Vector.java:427) at javax.swing.table.DefaultTableModel.setValueAt(DefaultTableModel.java:648) at javax.swing.JTable.setValueAt(JTable.java:2676) at javax.swing.JTable.editingStopped(JTable.java:4675) at javax.swing.AbstractCellEditor.fireEditingStopped(AbstractCellEditor.java:125) at javax.swing.AbstractCellEditor.stopCellEditing(AbstractCellEditor.java:68) at javax.swing.plaf.basic.BasicTableUI$Handler.mousePressed(BasicTableUI.java:986) at java.awt.AWTEventMulticaster.mousePressed(AWTEventMulticaster.java:263) at java.awt.Component.processMouseEvent(Component.java:6035) 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:3983) 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)

Não sei o que pode ser, não tenho muito conhecimendo sobre JTable, comecei a utilizar está semana.

Obrigado

Cadê o código?

Esse acabei de fazer e estou testando.

Vamos trocar experiências. KKKKKKKKKKKKKKKKKKK

Assim consiguiremos fazer uma JTABLE Genérica.

Já fiz uma classe para Popular qualquer JTABLE formatada.

    if (this.tblCoordenadasPoligonal.getSelectedRowCount() > 1) {
        for (int delLinhas = 0; delLinhas < this.tblCoordenadasPoligonal.getSelectedRowCount(); delLinhas++) {
            ((DefaultTableModel) this.tblCoordenadasPoligonal.getModel()).removeRow(delLinhas);
        }
    } else {

        ((DefaultTableModel) this.tblCoordenadasPoligonal.getModel()).removeRow(this.tblCoordenadasPoligonal.getSelectedRow());
    }

prsantos:
Não entendi muito o que você disse :S

Então sobre o código, não postei pois é muita coisa e não vale a pena públicar.
Basicamente eu faço assim:

Tenho uma tabela no banco de dados chamada xx: que contém estes registros: a, b, c, d. Quando eu clicar em deletar, e for a última linha, neste caso a “D”, eu vou no banco de dados, removo o D, depois chamo o método refreshJTable(). Nesse método eu pego e limpo os dados do meu modelo do JTable, ou seja, apago os valores: a, b, c, d, após apagar eu adiciono denovo o que tem no banco de dados, ou seja, todos menos o D: a, b, c.
Pronto adicionou, mas quando eu clico agora em uma linha (obs: apenas clicar sem fazer nada), ele da aquela excessão.

““Mas atenção””, o problema só ocorre quando eu deleto a última linha da JTable, se eu apagar as outras não da nada.

o que pode ser?

Apagou a última linha, tabela agora vazia, clicou no vazio, deu erro!?

Você está fazendo deste jeito,

((DefaultTableModel) this.jTable.getModel()).removeRow(this.jTable.getSelectedRow());

ou está fornecendo o número da linha?

Ele diz que está tentando acessar um elemento do vector (que são as linhas) que não mais existe.

Não é assim não… é quase isso!

Saca só como faço:

[code]while(jTable.getRowCount() > 0)
{
this.modelo.removeRow(0);
}

for(int i = 0; i < dados.length; i++)
{
this.modelo.addRow(formataRow(dados[i]));
}[/code]

Eu removo todas as linhas, depois eu adiciono todas as linhas… dados é um array de string[][] onde contém tudo os dados do banco.

A outro detalhe que notei agorinha. Se eu clicar no Header da JTable o problema acaba, ou seja, ta com o problema, não consigo selecionar nenhuma linha, ai eu clico no header da JTable ai volta ao normal. :S

HHHUUUUUUUUUUMMMMMMMMM!

Pois é!

Ao inves disso

this.modelo.addRow(formataRow(dados[i]))

Use isso que vai funcionar

((DefaultTableModel) this.JTable.getModel()).addRow(formataRow(dados[i]))

A Propósito:

Pode me mostrar o código de formatRow()?

Opa, mas está igual ao seu…

Olha só, o meu this.modelo é isso:

private DefaultTableModel modelo; // Atributo da classe ... ... this.modelo = new DefaultTableModel(new String[][]{}, this.colunas){ public boolean isCellEditable(int row, int col){ if(col == 4) { return true; } else { return false; } } };

e o meu formata é:

[code]private String[] formataRow(String[] row)
{
DiversasUtil diversas = new DiversasUtil();

    String[] retorno = new String[5];

    retorno[0] = row[0];
    retorno[1] = String.valueOf((int) Double.parseDouble(row[1]));
    retorno[2] = diversas.formataCasasDecimais(row[2], 2, ",");
    retorno[3] = diversas.formataCasasDecimais(row[3], 2, ",");
    retorno[4] = row[4];

    return retorno;

}[/code]

Mas como eu lhe disse, funciona tudo bem, exceto a última linha.
Como poderia estar errado se da pau só na última linha?

O que mais me intriga é que quando eu clico no header da JTable ai funciona…

Obrigado ai pela força prsantos

MERMÃO!

Pode fazer o teste com o código que enviei?

Por favor.

KKKKKKKKKKKKKKKKKKKKKKKKKKKKK

Vá lá! tenta!

Cara, fiz do jeito que tu passou ali, deu a mesma coisa :frowning:

Putz!

Pegou a linha e colou lá?

Tá phoda hein!

Não se desespere, iremos conseguir.

[quote=prsantos]Putz!

Pegou a linha e colou lá?

Tá phoda hein!

Não se desespere, iremos conseguir.[/quote]

Sim sim, fiz isso que você pediu, mas é a mesma coisa hehe, mas fiz igualzinho tava ali…

Ta complicado aqui, não sei o que fazer mais.

Só pra revisar o que eu disse…
Tenho essas linhas:
A
B
C
D
E

Se eu exluir a linha E (ou seja, a última), gera aquela excessão quando eu clico no JTable, MASSSS se eu clicar no nome das colunas (Header do JTable) ai logo após já posso clicar novamente no JTable ai não gera as excessões.

Obrigado pela força, se souber de algo me avisa ai…

Pô, to num mato sem cachorro aqui…!!

Alguém imagina o que pode ser?
Nem o thingol?

RESOLVIDO!!!

Só setei o modelo tudo denovo :slight_smile:

tipo onde eu tinha:

while(jTable.getRowCount() > 0) { this.modelo.removeRow(0); }

Deletei e dei um:

this.modelo = null;

Ai resto tudo denovo, onde setava o modelo… :slight_smile:

RESOLVIDO!!!

Só setei o modelo tudo denovo :slight_smile:

tipo onde eu tinha:

while(jTable.getRowCount() > 0) { this.modelo.removeRow(0); }

Deletei e dei um:

this.modelo = null;

Ai resto tudo denovo, onde setava o modelo… :slight_smile:

Calma ae!

Estou te mandando o que tenho e, que funciona.