[RESOLVIDO]NetBeans - initComponents - StackOverFlow

8 respostas
lucas_guj

Bom. Eu tenho um projeto no NetBeans. E ai eu crio um Formulario GUI Swing iniciando com um JFrame. Ai como todos que programam ou ja programaram no NetBeans sabe, ele inicia a classe com um construtor que tem o metodo initComponents - onde é responsavel por toda a inicialização dos componentes. Ai vamos supor que eu crie uma outra classe qualquer que precise de um OBJETO dessa classe Visual. Por exemplo:

Classe Visual com variaveis de instancia - Formulario Gui SWING

Classe NaoVisual para modificar uma variavel de instancia da classe Visual atraves de um metodo set

Ai eu coloco essa minha classe Visual como a principal do projeto para executar e crio uma variavel de instancia, string por exemplo e um metodo set para configura-la. Ai eu coloco um BOTAO que quando aperta ele cria e executa um objeto da outra classe NaoVisual, só para chamar a classe mesmo. Ai nessa classe NaoVisual, eu crio um objeto da classe Visual para acessar o metodo set da variavel de instancia e executo. Da uma exceção StackOverFlow, acredito que seja por eu estar criando um objeto da classe Visual e na hora da sua criação, ela chame o metodo initComponents novamente e da esse estouro de pilha. A minha duvida é:

Como eu faço para acessar as variaveis e metodos dessa classe visual sem ter que declara-los como Static?

PS: Não sei se coloquei na seção certa, caso não esteja peço desculpas e que movam o tópico por favor.

8 Respostas

vinnysoft

Olá Lucas.

Não entendi sua explicação. Está meio confusa. Você pode colocar um pouco de código para entendermos melhor?

Mas adiantando uma resposta, vamos nomear a classe do formulario de classe A, e a classe NaoVisual de classe B. Você poderia tentar instanciar a classe B e passar a referência da classe A no construtor da classe B, de forma que a B armazenasse essa referencia em uma variavel de instancia dela. Assim vc teria acesso aos métodos da classe A dentro da variavel de instancia da classe B. Seria isso?

É interessante também checar os modificadores dos métodos e variáveis de instância que vc quer utilizar.

Até +!

lucas_guj

vinnysoft:
Olá Lucas.

Não entendi sua explicação. Está meio confusa. Você pode colocar um pouco de código para entendermos melhor?

Mas adiantando uma resposta, vamos nomear a classe do formulario de classe A, e a classe NaoVisual de classe B. Você poderia tentar instanciar a classe B e passar a referência da classe A no construtor da classe B, de forma que a B armazenasse essa referencia em uma variavel de instancia dela. Assim vc teria acesso aos métodos da classe A dentro da variavel de instancia da classe B. Seria isso?

É interessante também checar os modificadores dos métodos e variáveis de instância que vc quer utilizar.

Até +!

Bom, vamos lá. Tentei fazer o que você sugeriu e não deu certo continua dando a exceção StackOverFlowError. Agora vou postar o codigo aqui. Primeiro eu crio um projeto no NetBeans chamado TesteDeInstancia, e depois crio uma classe principal chamada A, que vai ser um formulário JFrame com um JTextField e um JButton. O JTextField eu vou nomear de AreaDeTexto e o JButton eu vou chamar de Botao com o texto Aperta. Aqui está uma imagem de como está o JFrame:

E aqui está o código da classe A:

package testedeinstancia;

public class A extends javax.swing.JFrame {
    
    B objetoB = new B();
    
    /** Creates new form A */
    public A() {
        initComponents();
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        Botao = new javax.swing.JButton();
        jScrollPane1 = new javax.swing.JScrollPane();
        AreaDeTexto = new javax.swing.JTextArea();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        Botao.setText("Aperta");
        Botao.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                BotaoActionPerformed(evt);
            }
        });

        AreaDeTexto.setColumns(20);
        AreaDeTexto.setRows(5);
        jScrollPane1.setViewportView(AreaDeTexto);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addContainerGap(200, Short.MAX_VALUE)
                .addComponent(Botao)
                .addGap(135, 135, 135))
            .addGroup(layout.createSequentialGroup()
                .addGap(66, 66, 66)
                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(168, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addGap(31, 31, 31)
                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 80, Short.MAX_VALUE)
                .addComponent(Botao)
                .addGap(70, 70, 70))
        );

        pack();
    }// </editor-fold>

    // EVENTO DO BOTAO - PRESTE ATENÇÃO AQUI
    private void BotaoActionPerformed( java.awt.event.ActionEvent evt ) {
        objetoB.criaInstancia();
    }

    /**
     * @param args the command line arguments
     */
    public static void main( String args[] ) {
        /* Set the Nimbus look and feel */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
         */
        try {
            for( javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels() ) {
                if( "Nimbus".equals(info.getName()) ) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        }
        catch( ClassNotFoundException ex ) {
            java.util.logging.Logger.getLogger(A.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        catch( InstantiationException ex ) {
            java.util.logging.Logger.getLogger(A.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        catch( IllegalAccessException ex ) {
            java.util.logging.Logger.getLogger(A.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        catch( javax.swing.UnsupportedLookAndFeelException ex ) {
            java.util.logging.Logger.getLogger(A.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>

        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {

            public void run() {
                new A().setVisible(true);
            }
        });
    }
    
     // PRESTE ATENÇÃO AQUI - METODO PUBLIC VOID PARA CONFIGURAR AREA DE TEXTO
    public void setAreaDeTexto(String s) {
        AreaDeTexto.setText(s);
    }
    
    // Variables declaration - do not modify
    private javax.swing.JTextArea AreaDeTexto;
    private javax.swing.JButton Botao;
    private javax.swing.JScrollPane jScrollPane1;
    // End of variables declaration
}

E agora o código da classe B que eu quero uma instancia da classe A para acessar o metodo setAreaDeTexto sem ter que declara-lo como static

package testedeinstancia;

public class B {
    A obj = new A();
    
    public void criaInstancia() {
        // Se eu instanciar a classe a aqui dentro do método, o programa não da erro, porém não acontece nada. Ele não instancia e não chama o metodo.
        obj.setAreaDeTexto("Modifiquei o texto");
    }
}

Agora será que você e outras pessoas irão conseguir entender?

vinnysoft

Olá!

Bem amigo, acredito que seu problema esteja aqui:

A obj = new A();

Quando vc usa new A(), você está criando um novo objeto de A, e não aproveitando o mesmo que foi criado na execução do aplicativo.

Tenta reescrever a classe B assim:

package testedeinstancia;  
      
    public class B {  
        A obj;

        public B (A instancia)
        {
              this.obj = instancia;
        }
          
        public void criaInstancia() {  
            // Se eu instanciar a classe a aqui dentro do método, o programa não da erro, porém não acontece nada. Ele não instancia e não chama o metodo.  
            obj.setAreaDeTexto("Modifiquei o texto");  
        }  
    }

E na classe A inicie assim

B objetoB;  
      
    /** Creates new form A */  
    public A() {  
        initComponents(); 
        objetoB = new B(A); //Ai você passará a referência da instancia atual de A para a classe B. 
    }  

//O resto continua...

Testa ai e confirme se funciona.

Até!

lucas_guj

Fiz o exatamente o que você falou e ele informa um erro dizendo que a variavel A não existe em:

Na classe B

objetoB = new B(A); //Ai você passará a referência da instancia atual de A para a classe B.

E se ao inves de usar o A eu colocar o this dentro do construtor na hora de instanciar o objeto B, o projeto executa, nao acontece erro nenhum, porem não exibi o formulario
é como se nada acontecesse. Lembrando, isso se eu colocar this dentro do construtor assim:

objetoB = new B(this); //Ai você passará a referência da instancia atual de A para a classe B.
vinnysoft

Olá!

É verdade no lugar de new B(A) o correto é new B(this); , acabei confundindo na hora de escrever…

Estranho pois fiquei curioso e fiz um projeto aqui, e funcionou. Usando o código abaixo e clicando no botão ele muda o valor do texto:

Classe A

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package estudo;

public class A extends javax.swing.JFrame {

    B objetoB;
    
    /**
     * Creates new form A
     */
    public A() {
        initComponents();   
        objetoB = new B(this);
    }
       public void setAreaDeTexto(String s)
       {
           this.jTextArea1.setText(s);
       }
    

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        jButton1 = new javax.swing.JButton();
        jScrollPane1 = new javax.swing.JScrollPane();
        jTextArea1 = new javax.swing.JTextArea();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        jButton1.setText("jButton1");
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton1ActionPerformed(evt);
            }
        });

        jTextArea1.setColumns(20);
        jTextArea1.setRows(5);
        jScrollPane1.setViewportView(jTextArea1);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(164, 164, 164)
                .addComponent(jButton1)
                .addContainerGap())
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addContainerGap(125, Short.MAX_VALUE)
                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(109, 109, 109))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(55, 55, 55)
                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 71, Short.MAX_VALUE)
                .addComponent(jButton1)
                .addGap(55, 55, 55))
        );

        pack();
    }// </editor-fold>

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
        objetoB.criaInstancia();
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        /*
         * Set the Nimbus look and feel
         */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /*
         * If Nimbus (introduced in Java SE 6) is not available, stay with the
         * default look and feel. For details see
         * http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(A.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(A.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(A.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(A.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>

        /*
         * Create and display the form
         */
        java.awt.EventQueue.invokeLater(new Runnable() {

            public void run() {
                new A().setVisible(true);
            }
        });
    }
    // Variables declaration - do not modify
    private javax.swing.JButton jButton1;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JTextArea jTextArea1;
    // End of variables declaration
}

Classe B

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package estudo;

public class B {

    A obj;
    
    public B(A instancia) {
        obj = instancia;
    }
    
    public void criaInstancia()
    {
         // Se eu instanciar a classe a aqui dentro do método, o programa não da erro, porém não acontece nada. Ele não instancia e não chama o metodo.    
        obj.setAreaDeTexto("Modifiquei o texto"); 
    }
    
}

Confere se não tem algo diferente no seu código.

Até +!

lucas_guj

vinnysoft

verifiquei a diferença da sua classe com a minha e percebi o erro. O erro estava na classe B porque eu estava estendendo a classe A…¬¬…É que eu tava fazendo outros testes e esqueci o extends lá. Bom pelo visto eu consegui. Porém queria entender como você chegou a esse resultado. Queria aprender. Fora isso o tópico está resolvido. Mas se puder me ajudar ainda eu agradeço. Obrigado

vinnysoft

lucas_guj:
vinnysoft

verifiquei a diferença da sua classe com a minha e percebi o erro. O erro estava na classe B porque eu estava estendendo a classe A…¬¬…É que eu tava fazendo outros testes e esqueci o extends lá. Bom pelo visto eu consegui. Porém queria entender como você chegou a esse resultado. Queria aprender. Fora isso o tópico está resolvido. Mas se puder me ajudar ainda eu agradeço. Obrigado

Olá Lucas! Que bom que deu certo.

Bem, segue algumas referências para aprender um pouco mais do funcionamento do java:

http://www.caelum.com.br/download/caelum-java-objetos-fj11.pdf - Essa apostila é gratuita e é uma boa para iniciar.
http://www.livrariasaraiva.com.br/produto/1853081/estruturas-de-dados-e-algoritmos-em-java-4-ed-2007/?PAC_ID=18659 - Esse é um pouco mais avançado, mas também é muito bom!

Espero ter ajudado.

Até +!

lucas_guj

Obrigado. Ajudou sim. Quanto a apostila da caelum, muitos indicam para iniciante. E eu estou lendo a apostila use a cabeça. e java como programar

Criado 3 de abril de 2012
Ultima resposta 4 de abr. de 2012
Respostas 8
Participantes 2