Resgatar dados do modelo de uma jTable

5 respostas
P

Pessoal estou com problemas para retornar os dados de uma linha de uma jTable pelo modelo, creio que seja porque no modelo eu adiciono a linha com mais valores do que eu exibo no jTable. Para adicionar uma linha eu faço o seguinte:

modelo.addRow(new Object[]{peso, new Boolean(false), codigo, maquina, produto});

Agora para retornar a linha clicada eu faço isso:

for(int index = 0; index < modelo.getRowCount(); index++){
            if(((Boolean)modelo.getValueAt(index, 1)).booleanValue()){
                peso = (Double)modelo.getValueAt(index, 0);
                codigo = (Integer)modelo.getValueAt(index, 2);
                maquina = (Integer)modelo.getValueAt(index, 3);
                produto = (Integer)modelo.getValueAt(index, 4);
            }
        }

Isso começou a gerar a seguinte excessão:

Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 2 >= 2
Eu adiciono no modelo 5 colunas e exibo somente na jTable 2 colunas (0 e 1). Li no fórum que isso é possível, estou fazendo errado então?

5 Respostas

Mantu

Olá!
Dê uma verificada se a estrutura que você utiliza para armazenar os dados da tabela realmente tem 5 colunas, ou se a sua implementação de getValueAt está correta.
Poste aqui também o stack trace completo, ok?

P

Cara acho que meu problema e conseqüentemente minha dúvida está na estrutura, eu uso o Netbeans e pelo seu editor visual eu criei uma tabela com duas colunas, feito isso eu carrego dois métodos (um para redefinir o tamanho das colunas) e outro para definir um modelo para a tabela da seguinte forma:

public void setSizeTable(){
        Grade.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
        Grade.getColumnModel().getColumn(0).setPreferredWidth(170);
        Grade.getColumnModel().getColumn(1).setPreferredWidth(15);
    }
    
    public DefaultTableModel getModel(){
        modelo = (DefaultTableModel)Grade.getModel();
        
        return modelo;
    }

Assim quando o usuário clica em um botão eu vou adicionando linhas a essa tabela usando o modelo da seguinte forma:

public void  addRow(int codigo, double peso, int maquina, int produto){
        if(modelo.getRowCount() == 4 && contTable == 0){
            for(int i = modelo.getRowCount() - 1; i >= 0; --i){
                modelo.removeRow(i);
            }
        }
        
        modelo.addRow(new Object[]{peso,
                                   new Boolean(false),
                                   codigo,
                                   maquina,
                                   produto});  
               
        contTable++;
    }

Até aqui vai tudo muito bem, porém eu determinado momento ao clicar em um campo booleano dentro da tabela vai iniciar um processo onde eu preciso capturar todos os dados da linha com o booleano selecionado, é nisso que ocorre a excpetion, o código está abaixo:

for(int index = 0; index < modelo.getRowCount(); index++){
            if(((Boolean)modelo.getValueAt(index, 1)).booleanValue()){
                peso = (Double)modelo.getValueAt(index, 0);
                codigo = (Integer)modelo.getValueAt(index, 2);
                maquina = (Integer)modelo.getValueAt(index, 3);
                produto = (Integer)modelo.getValueAt(index, 4);
            }
        }

Dispara a seguinte exception:

Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 2 >= 2
        at java.util.Vector.elementAt(Vector.java:432)
        at javax.swing.table.DefaultTableModel.getValueAt(DefaultTableModel.java:622)
        at br.com.alimentoswilson.gui.Main.GradeMouseClicked(Main.java:561)
        at br.com.alimentoswilson.gui.Main.access$600(Main.java:36)
        at br.com.alimentoswilson.gui.Main$11.mouseClicked(Main.java:396)
        at java.awt.AWTEventMulticaster.mouseClicked(AWTEventMulticaster.java:212)
        at java.awt.Component.processMouseEvent(Component.java:5491)
        at javax.swing.JComponent.processMouseEvent(JComponent.java:3126)
        at java.awt.Component.processEvent(Component.java:5253)
        at java.awt.Container.processEvent(Container.java:1966)
        at java.awt.Component.dispatchEventImpl(Component.java:3955)
        at java.awt.Container.dispatchEventImpl(Container.java:2024)
        at java.awt.Component.dispatchEvent(Component.java:3803)
        at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4212)
        at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3901)
        at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3822)
        at java.awt.Container.dispatchEventImpl(Container.java:2010)
        at java.awt.Window.dispatchEventImpl(Window.java:1778)
        at java.awt.Component.dispatchEvent(Component.java:3803)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:463)
        at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:242)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:163)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:157)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:149)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:110)

Ficou meio longo o post mas não to achando a minha falha.

Juliano_Pedroso_da_S

Cara já tive uns problemas com JTable parecidos com esse seu, se eu entendi o seu problema vc está usando uma classe modelo para criar essa JTable, você está utilizando o NetBeans, pelo que vi no seu código sua tabela do modelo tem 4 colunas, dá uma olhada no componente do tipo JTable que você colocou no JFrame ou sei lá o que vc está usando não está com mais de 4 colunas, pode ser isso, mas tenta colocar o erro completo com a causa.

leandros

o seu modelo.getRowCount() está retornando um numéro de indice maior do que o esperado de acordo com o tamanho de colunas!

P

Pessoal valeu pela força, notei um certo esforço para fazer que a jTable tenha colunas não exibidas ao usuário que continuem no modelo com seus respectivos valores.
Como tenho pouco tempo para me aprofundar consegui uma solução que embora não seja “bonita” de se ver, está se mostrando funcional nos testes.
Quando eu crio mais um linha no meu método addRow(), eu criei um ArrayList e adiciono nele os valores “ocultos” como o ID, como são adicionados no mesmo momento, eles vão possuir índices iguais, daí quando eu resgato a linha na jTable pelo seu índice eu resgato junto o valor no ArrayList.
É feio e meio POG mas tá rolando. :lol:

Criado 11 de julho de 2007
Ultima resposta 13 de jul. de 2007
Respostas 5
Participantes 4