Acessar conteudo de Component

5 respostas
luiz_ross
Como eu faço pra guardar e acessar o conteudo digitado dentro de um JTextField sem que esse acesso seja feito pela classe em que o JTextField foi criado?Segue o código e o erro que dá
public class Cadastro extends javax.swing.JFrame {
     MyAction acao;
    public Cadastro() {
        initComponents();
        acao = new MyAction();
         jButton1 = new javax.swing.JButton(acao);
         getContentPane().add(jButton1);
        jButton1.setBounds(60, 150, 90, 20);
    }
    
private void initComponents() {
        jLabel1 = new javax.swing.JLabel();
        t_nome = new javax.swing.JTextField();

        getContentPane().setLayout(null);

        addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowClosing(java.awt.event.WindowEvent evt) {
                exitForm(evt);
            }
        });

        jLabel1.setText("Nome:");
        getContentPane().add(jLabel1);
        jLabel1.setBounds(20, 100, 41, 16);

        getContentPane().add(t_nome);
        t_nome.setBounds(60, 100, 250, 20);

        pack();
        java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
        setSize(new java.awt.Dimension(400, 300));
        setLocation((screenSize.width-400)/2,(screenSize.height-300)/2);
    }
     
                
    private void exitForm(java.awt.event.WindowEvent evt) {
        System.exit(0);
    }
    
    public static void main(String args[]) {
        new Cadastro().show();
    }
    
    private javax.swing.JButton jButton1;
    private javax.swing.JLabel jLabel1;
    public javax.swing.JTextField t_nome;
    
}
Classe que gera a ação do botão
import java.awt.event.*;
import java.awt.*;
import javax.swing.*;


public class MyAction extends AbstractAction { 
    Bean b = new Bean();
    Cadastro t = new Cadastro();  
    
    public MyAction() { 
       putValue(SHORT_DESCRIPTION, "Teste"); 
      } 

      public void actionPerformed(ActionEvent e) { 
            b.setNome(t.t_nome.getText()); // aqui eu tento gravar o dado digitado no Bean
            
            System.out.println(b.getNome()); // aqui eu tento ver o dado foi gaurdado dentro do Bean
}
}
public class Bean {
String nome;
/**
 * Returns the nome.
 * @return String
 */
public String getNome() {
	return nome;
}

/**
 * Sets the nome.
 * @param nome The nome to set
 */
public void setNome(String nome) {
	this.nome = nome;
}

}
esse é o erro que gera
java.lang.StackOverflowError
        at sun.awt.windows.WComponentPeer.getToolkit(WComponentPeer.java:398)
        at java.awt.Component.getToolkitImpl(Component.java:820)
        at java.awt.Component.getToolkitImpl(Component.java:824)
        at java.awt.Component.getToolkitImpl(Component.java:824)
        at java.awt.Component.getToolkitImpl(Component.java:824)
        at java.awt.Component.getToolkitImpl(Component.java:824)
        at java.awt.Component.getToolkit(Component.java:810)
        at java.awt.Component.addNotify(Component.java:5360)
        at java.awt.Container.addNotify(Container.java:1997)
        at javax.swing.JComponent.addNotify(JComponent.java:4270)
        at java.awt.Container.addNotify(Container.java:2004)
        at javax.swing.JComponent.addNotify(JComponent.java:4270)
        at java.awt.Container.addNotify(Container.java:2004)
        at javax.swing.JComponent.addNotify(JComponent.java:4270)
        at java.awt.Container.addNotify(Container.java:2004)
        at javax.swing.JComponent.addNotify(JComponent.java:4270)
        at javax.swing.JRootPane.addNotify(JRootPane.java:658)
        at java.awt.Container.addNotify(Container.java:2004)
        at java.awt.Window.addNotify(Window.java:410)
        at java.awt.Frame.addNotify(Frame.java:479)
        at java.awt.Window.pack(Window.java:428)
        at Cadastro.initComponents(Cadastro.java:46)
        at Cadastro.<init>(Cadastro.java:15)
        at MyAction.<init>(MyAction.java:18)
        at Cadastro.<init>(Cadastro.java:16)

Agradeço qualquer ajuda

5 Respostas

luiz_ross

Num to intendendo porque que não consigo imprimir o conteudo de setNome() por aqui

public class MyAction extends AbstractAction { 
    Bean b = new Bean(); 
    
    public MyAction() { } 

      public void actionPerformed(ActionEvent e) {

     System.out.println(b.nome); [b]Quanto eu tento imprimir o conteudo dessa maneira não aparece nada, eu fiz teste de tentar imprimir pela  classe cadastro e imprimiu, não sei, mas parece que o acesso ao conteudo de setNome  é permitido uma vez depois ele é apagado, ou seja não  persistência.[/b] E agora quem poderá me ajudar?


} 
}
lalgarve

Luiz,

Eu modifiquei o seu código. Procurei não mudar muita coisa mas notei algumas falhas importantes, como declarar a variável t_nome como sendo pública. Isto quebra o encapsulamento e toda a vantagem de querer usar um Bean é jogada fora. Não creio que o Bean deva ser criado dentro da classe Cadastro (vc não fez isto mas tb não funcionava), então eu criei uma nova classe com o nome Principal que é uma JFrame e o Cadastro passou a ser um JPanel. Dessa maneira o Bean fica independente da classe Cadastro e pode ser usado em outros lugares.

import java.awt.*;

public class Principal extends javax.swing.JFrame { 
    
    private Bean myBean;
    private Cadastro cadastro;
    
    public Principal() { 
        myBean = new Bean();
        initComponents(); 
    } 
    
    private void initComponents() {
        cadastro = new Cadastro(myBean); 
        getContentPane().add(cadastro, BorderLayout.CENTER); 

        addWindowListener(new java.awt.event.WindowAdapter() { 
            public void windowClosing(java.awt.event.WindowEvent evt) { 
                exitForm(evt); 
            } 
        }); 

        pack(); 
        java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize(); 
        setSize(new java.awt.Dimension(400, 300)); 
        setLocation((screenSize.width-400)/2,(screenSize.height-300)/2); 
    } 
      
                
    private void exitForm(java.awt.event.WindowEvent evt) { 
        System.exit(0); 
    } 
    
    public static void main(String args[]) { 
        new Principal().setVisible(true); 
    } 
}
public class Cadastro extends javax.swing.JPanel{ 

    private javax.swing.JButton jButton1; 
    private javax.swing.JLabel jLabel1; 
    private javax.swing.JTextField t_nome;    
    private Bean myBean;

    public Cadastro(Bean myBean) { 
        MyAction acao;
        
        initComponents(); 
        this.myBean = myBean;
        acao = new MyAction(myBean, t_nome); 
        jButton1 = new javax.swing.JButton(acao); 
        add(jButton1); 
        jButton1.setBounds(60, 150, 90, 20); 
    } 
    
    private void initComponents() { 
        jLabel1 = new javax.swing.JLabel(); 
        t_nome = new javax.swing.JTextField(); 

        setLayout(null); 

        jLabel1.setText("Nome:"); 
        add(jLabel1); 
        jLabel1.setBounds(20, 100, 41, 16); 

        add(t_nome); 
        t_nome.setBounds(60, 100, 250, 20); 

    } 
      
                  
 
    
}
public class Bean { 
String nome; 
/** 
* Returns the nome. 
* @return String 
*/ 
public String getNome() { 
   return nome; 
} 

/** 
* Sets the nome. 
* @param nome The nome to set 
*/ 
public void setNome(String nome) { 
   this.nome = nome; 
} 

}
import java.awt.event.*; 
import java.awt.*; 
import javax.swing.*; 


public class MyAction extends AbstractAction { 
    Bean myBean; 
    JTextField myTextField;
    
    public MyAction(Bean myBean, JTextField myTextField) { 
       putValue(SHORT_DESCRIPTION, "Teste"); 
       this.myBean = myBean;
       this.myTextField = myTextField;
    } 

      public void actionPerformed(ActionEvent e) { 
            myBean.setNome(myTextField.getText()); // aqui eu tento gravar o dado digitado no Bean 
            
            System.out.println(myBean.getNome()); // aqui eu tento ver o dado foi gaurdado dentro do Bean 
      } 
}

Mas um detalhe, se vc quer realmente que a sua aplicação Swing rode bem em qualquer plataforma, vc tem que usar LayoutManagers. É difícil de aprender, mas vale a pena. :wink:

luiz_ross

Como eu amo as mulheres!!! :roll:
Brincadeirinhas a parte

Obrigado Leila, fico agradecido por ter arrumado o código e apontado meus erros.

S

Olá, como vão?
Deswculpe me intrometer :oops: Mas tenho uma pergunta que não quer calar:
como resolver um StackOverflowError?

Rafael_Steil

“samurai”:
Olá, como vão?
Deswculpe me intrometer :oops: Mas tenho uma pergunta que não quer calar:
como resolver um StackOverflowError?

Ter cuidado com chamadas recursivas :wink:

Rafael

Criado 12 de abril de 2003
Ultima resposta 22 de jun. de 2004
Respostas 5
Participantes 4