Problema em inicializar matriz!

10 respostas
guisantogui

Gente to com um probleminha aqui!

Eu fiz uma matriz auxiliar para pegar todos os dados de um JTable para depois poder manipulá-los, mas ele ta dando NullPointer eu acho que por que na matriz só inicializo o primeiro par de colchetes mas quando tento inicializar os dois o compilador estou indexOutOfBounds :?

levando em consideração ainda que eu sempre adiciono uma linha quando todas as linhas estão preenchidas quando a tabela perde o foco!

vou colocar o cod do evento aqui a baixo e a linha q ta dando o erro!

String[][] tabela = new String[2][]; 

        System.out.println(tabelaTeste.getRowCount());
        System.out.println(tabelaTeste.getColumnCount());
        System.out.println(tabelaTeste.getModel().getRowCount());
        System.out.println(tabelaTeste.getModel().getColumnCount());

        try{
            for(int i = 0; i < tabelaTeste.getColumnCount(); i++){ // Preenche array para colocar no BD
                for(int j = 0; j < tabelaTeste.getRowCount(); j++){
                    tabela[i][j] = (String) tabelaTeste.getValueAt(i, j); // <-- Linha que estoura a NPE e a OutOfBounds
                }
            }
        }
        catch(NullPointerException npe){
            npe.printStackTrace();
            System.out.println("Erro");
        }

        String colNome = "";
        String colLP = "";
        String colProx = "";

        try {
            for(int i = 0; i < tabela[0].length; i++){ // Alterando
                if(rs.getNString(1).equalsIgnoreCase(tabela[0][i])){ // Caminhando por colunas e pegando as linhs!
                    colNome = tabela[1][i];                         // Quando achar usar [Todas linhas] [i] = nesse caso [3][i] alterando a segunda e terceira
                    colLP = tabela [2][i];
                    colProx = tabela [0][i];
                    gt.alteraDado("UPDATE Teste SET Nome = "+colNome+", Linguagem = "+colLP+", WHERE proximo = "+colProx);
                }
            }
        }

        catch (SQLException ex) {
            Logger.getLogger(TesteFoco.class.getName()).log(Level.SEVERE, null, ex);
        }
        catch(NullPointerException npe){
            npe.printStackTrace();
            System.out.println("ERRO 2");
        }
        this.dispose();

10 Respostas

ViniGodoy

Preciso dizer que você não teria essa complicação toda se não usasse o DefaultTableModel?

ViniGodoy

É bom inicializar seu array assim:

String[][] tabela = new String[tabela.getRowCount()][tabela.getColumnCount()];

E Deus tenha piedade da alma de quem vai manter seu sistema…

guisantogui

Pois eh amigo, mas aqui eu só sigo ordens! :confused:

E para dizer que devo mudar o sistema e vai levar mais algum tempo me arrancam a cabeça aqui!
:?

mas vlw!

guisantogui

Vini com aquela mudança que vc me sugeriu gerou o seguinte erro!

Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 2 >= 2
        at java.util.Vector.elementAt(Vector.java:427)
        at javax.swing.table.DefaultTableModel.getValueAt(DefaultTableModel.java:632)
        at javax.swing.JTable.getValueAt(JTable.java:2685)
        at TesteFoco.TesteFoco.btnSairActionPerformed(TesteFoco.java:159)
        at TesteFoco.TesteFoco.access$100(TesteFoco.java:14)
        at TesteFoco.TesteFoco$3.actionPerformed(TesteFoco.java:77)
        at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
        at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
        at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
        at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
        at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
        at java.awt.Component.processMouseEvent(Component.java:6263)
        at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
        at java.awt.Component.processEvent(Component.java:6028)
        at java.awt.Container.processEvent(Container.java:2041)
        at java.awt.Component.dispatchEventImpl(Component.java:4630)
        at java.awt.Container.dispatchEventImpl(Container.java:2099)
        at java.awt.Component.dispatchEvent(Component.java:4460)
        at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4574)
        at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238)
        at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)
        at java.awt.Container.dispatchEventImpl(Container.java:2085)
        at java.awt.Window.dispatchEventImpl(Window.java:2478)
        at java.awt.Component.dispatchEvent(Component.java:4460)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

O estouro é na mesma linha de antes! :?

ViniGodoy

Seu for está invertido.

for(int i = 0; i < tabelaTeste.getRowCount(); i++){ // Primeiro as linhas for(int j = 0; j < tabelaTeste.getColumnCount(); j++){ //Depois as colunas tabela[i][j] = (String) tabelaTeste.getValueAt(i, j); } }

Você não precisa perder tempo com o AbstractTableModel.
Todo o tempo que você já perdeu fazendo esse seu método já teria sido ganho.

E todo tempo que você vai perder daqui em diante também.

guisantogui

Sim, eu inverti o for propositalmente, pois queria apenas procurar nos dados da primeira coluna, não tendo que ir em todas as colunas da JTable, só tem como fazer pegando pelas linhas?

vlw pela ajuda!

ViniGodoy

Sim, é só fazer uma matriz unidimensional, e fixar o primeiro parâmetro:

String[] primeiraLinha = new String[tabela.getColumnCount()];

for (int i = 0; i < tabela.getColumnCount(); i++) {
   primeiraLinha[i] = tabela.getValueAt(0, i);
}

Mas tem que lembrar que a ordem sempre é linha, coluna. Como na notação matemática.

guisantogui

Nunca usei uma “matriz unidimensional”!

tentei analisar o seu codigo, mas me perdi, poderia explicar de uma outra forma se não for pedir mto! :wink:

brigado pela força Vini

guisantogui

Funcionou sua ideia Vini valeu!

Vou ter que bolar algo agora para pegar os dados e jogar no BD, mas ta valendo! :smiley:

guisantogui

Olha soh, mas agora eu fiquei com um array correto ao invés de uma matriz e tipo para mim pegar os dados referente as linhas corretas no array vai ser impossivel, pois todos os dados de uma tabela estão no array.

Tipo eu terei que fazer uma matriz para cada linha da tabela? :shock:

vlw mais uma vez! :wink:

Criado 17 de maio de 2010
Ultima resposta 17 de mai. de 2010
Respostas 10
Participantes 2