[RESOLVIDO]NetBeans - initComponents - StackOverFlow

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.

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é +!

[quote=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é +![/quote]

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?

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é!

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. 

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é +!

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

[quote=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[/quote]

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é +!

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