Problema Encapsulamento

8 respostas
hegedus

Ola estou tentando fazer um encapsulamento com 3 classes:
Principal.java, mostraDado.java, encapDados
e funcionam da seguinte forma
na classe principal eu tenho um formulario onde eu cadastro alguns dados que sao instanciados para a classe encapDados.
ate ai tudo bem funciona perfeitamente, tanto que se eu mostrar na classe principal os daods encapsulados sera mostrado sem problemas, porem se eu tento mostrar mostrar no mostraDados nao aparece nada ele nao consegue pegar os dados da encapDados.

seguem os codigos: encapDados.java
package dados;

public class encapDados {
   
    private String nome;
    private String sbNome;
    private String idade;

   
    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

     public String getSbNome() {
        return sbNome;
    }

    public void setSbNome(String sbNome) {
        this.sbNome = sbNome;
    }

      public String getIdade() {
        return idade;
    }

       public void setIdade(String idade) {
        this.idade = idade;
    }
}
Principal.java
import dados.encapDados;
import javax.swing.JOptionPane;

public class Principal extends javax.swing.JFrame {
    encapDados e = new encapDados();


    public Principal  () {
        initComponents();
        lTexto.setText(null);

    }

 
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        jbCad = new javax.swing.JButton();
        jbLimpar = new javax.swing.JButton();
        jbSair = new javax.swing.JButton();
        tfNome = new javax.swing.JTextField();
        tfSNome = new javax.swing.JTextField();
        tfIdade = new javax.swing.JTextField();
        jLabel1 = new javax.swing.JLabel();
        jLabel2 = new javax.swing.JLabel();
        jLabel3 = new javax.swing.JLabel();
        lTexto = new javax.swing.JLabel();
        jButton1 = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        jbCad.setText("Cadastra");
        jbCad.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jbCadActionPerformed(evt);
            }
        });

        jbLimpar.setText("Limpar");
        jbLimpar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jbLimparActionPerformed(evt);
            }
        });

        jbSair.setText("Sair");
        jbSair.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jbSairActionPerformed(evt);
            }
        });

        jLabel1.setText("Nome.:");

        jLabel2.setText("Sobrenome.:");

        jLabel3.setText("Idade.:");

        lTexto.setForeground(new java.awt.Color(204, 0, 0));
        lTexto.setText("Só numero");

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

        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(31, 31, 31)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(jLabel1)
                            .addComponent(jLabel2)
                            .addComponent(jLabel3))
                        .addGap(18, 18, 18)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addGroup(layout.createSequentialGroup()
                                .addComponent(tfIdade, javax.swing.GroupLayout.PREFERRED_SIZE, 29, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addGap(18, 18, 18)
                                .addComponent(lTexto))
                            .addComponent(tfSNome, javax.swing.GroupLayout.DEFAULT_SIZE, 123, Short.MAX_VALUE)
                            .addComponent(tfNome, javax.swing.GroupLayout.DEFAULT_SIZE, 123, Short.MAX_VALUE)))
                    .addGroup(layout.createSequentialGroup()
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                            .addComponent(jButton1)
                            .addGroup(layout.createSequentialGroup()
                                .addComponent(jbCad)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(jbLimpar)))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(jbSair)))
                .addGap(25, 25, 25))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addContainerGap(34, Short.MAX_VALUE)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addComponent(jLabel1)
                    .addComponent(tfNome, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addComponent(jLabel2)
                    .addComponent(tfSNome, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addComponent(jLabel3)
                    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(tfIdade, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(lTexto)))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.CENTER)
                    .addComponent(jbLimpar)
                    .addComponent(jbCad)
                    .addComponent(jbSair))
                .addGap(11, 11, 11)
                .addComponent(jButton1)
                .addContainerGap())
        );

        pack();
        java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
        java.awt.Dimension dialogSize = getSize();
        setLocation((screenSize.width-dialogSize.width)/2,(screenSize.height-dialogSize.height)/2);
    }// </editor-fold>                        

    private void jbCadActionPerformed(java.awt.event.ActionEvent evt) {                                      
        int num;
        
        try{
            num = Integer.parseInt(tfIdade.getText());
            lTexto.setText(null);
            e.setNome(tfNome.getText());
            e.setSbNome(tfSNome.getText());
            e.setIdade(tfIdade.getText());
            JOptionPane.showMessageDialog(rootPane,"Dados Cadastrados");
        }
        catch(NumberFormatException erro){
            lTexto.setText("cactere invalido");
        }

        catch(Exception erro){
            JOptionPane.showMessageDialog(null,"Nao foi gravado");
        }

    }                                     

    private void jbLimparActionPerformed(java.awt.event.ActionEvent evt) {                                         
        tfNome.setText(null);
        tfSNome.setText(null);
        tfIdade.setText(null);
    }                                        

    private void jbSairActionPerformed(java.awt.event.ActionEvent evt) {                                       
    System.exit(0);           }                                      

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        new mostraDado().show();
    }                                        

    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new Principal().setVisible(true);
            }
        });
    }

    private javax.swing.JButton jButton1;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JButton jbCad;
    private javax.swing.JButton jbLimpar;
    private javax.swing.JButton jbSair;
    private javax.swing.JLabel lTexto;
    private javax.swing.JTextField tfIdade;
    private javax.swing.JTextField tfNome;
    private javax.swing.JTextField tfSNome;

}

mostraDado.java

import dados.encapDados;



public class mostraDado extends javax.swing.JFrame {
    encapDados e = new encapDados();


        public mostraDado() {
        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() {

        lNome = new javax.swing.JLabel();
        lSNome = new javax.swing.JLabel();
        lIdade = new javax.swing.JLabel();
        jButton1 = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        lNome.setText("Nome");
        lNome.addAncestorListener(new javax.swing.event.AncestorListener() {
            public void ancestorMoved(javax.swing.event.AncestorEvent evt) {
            }
            public void ancestorAdded(javax.swing.event.AncestorEvent evt) {
                lNomeAncestorAdded(evt);
            }
            public void ancestorRemoved(javax.swing.event.AncestorEvent evt) {
            }
        });

        lSNome.setText("Sobrenome");
        lSNome.addAncestorListener(new javax.swing.event.AncestorListener() {
            public void ancestorMoved(javax.swing.event.AncestorEvent evt) {
            }
            public void ancestorAdded(javax.swing.event.AncestorEvent evt) {
                lSNomeAncestorAdded(evt);
            }
            public void ancestorRemoved(javax.swing.event.AncestorEvent evt) {
            }
        });

        lIdade.setText("Idade");
        lIdade.addAncestorListener(new javax.swing.event.AncestorListener() {
            public void ancestorMoved(javax.swing.event.AncestorEvent evt) {
            }
            public void ancestorAdded(javax.swing.event.AncestorEvent evt) {
                lIdadeAncestorAdded(evt);
            }
            public void ancestorRemoved(javax.swing.event.AncestorEvent evt) {
            }
        });

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

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addGap(44, 44, 44)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(lIdade)
                            .addComponent(lSNome)
                            .addComponent(lNome)))
                    .addGroup(layout.createSequentialGroup()
                        .addContainerGap()
                        .addComponent(jButton1)))
                .addContainerGap(120, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(53, 53, 53)
                .addComponent(lNome)
                .addGap(18, 18, 18)
                .addComponent(lSNome)
                .addGap(18, 18, 18)
                .addComponent(lIdade)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 28, Short.MAX_VALUE)
                .addComponent(jButton1)
                .addContainerGap())
        );

        java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
        setBounds((screenSize.width-234)/2, (screenSize.height-231)/2, 234, 231);
    }// </editor-fold>                        

    private void lNomeAncestorAdded(javax.swing.event.AncestorEvent evt) {                                    

        lNome.setText(e.getNome());
    }                                   

    private void lSNomeAncestorAdded(javax.swing.event.AncestorEvent evt) {                                     
       lSNome.setText(e.getSbNome());
    }                                    

    private void lIdadeAncestorAdded(javax.swing.event.AncestorEvent evt) {                                     
        lIdade.setText(e.getIdade());
    }                                    

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

    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new mostraDado().setVisible(true);
            }
        });
    }
               
    private javax.swing.JButton jButton1;
    private javax.swing.JLabel lIdade;
    private javax.swing.JLabel lNome;
    private javax.swing.JLabel lSNome;                 

}

Esse é o codigo com botes e tudo mais.
Aguardo ajuda.
Desculpem se esta alguma coisa fora do padrão, ainda sou novo no site.

PS: Estou usando o Netbeans 6.8
Obrigado.

8 Respostas

pedroroxd

O erro está dando por conta disso:
No mostraDado.java você faz isso:

encapDados e = new  encapDados()

Ou seja, você está criando um novo objeto, e instanciando ele como new, ou seja, é um novo objeto da classe (ou seja, vazio).
Por isso quando você tenta fazer lNome.setText(e.getNome()); vem vazio.

O que você pode fazer é criar um método no Principal.java pra retornar o objeto já instanciado (já com tudo setado) da classe encapDados.

fesaab

Isso acontece porque vc cria um novo objeto encapDados em cada classe:

encapDados e = new encapDados();
isso ocorre na linha 5 do Principal.java e na linha 6 do mostraDado.java.

Vc cria um novo objeto em cada classe, ou seja, apesar de serem objetos da mesma classe, não são os mesmos!!!
Por isso que quando vc atualiza 1, o outro não muda.

Uma maneira de vc resolver isso é criar o objeto em apenas um local (eu diria no Principal.java) e toda vez que vc for precisar desse objeto em outro lugar, vc envia ele como parâmetro.

Sendo assim, a tua classe mostraDado.java sofreria a seguinte alteração:

import dados.encapDados;

public class mostraDado extends javax.swing.JFrame {
    encapDados e; //vc soh diz que tem um objeto, porém não cria ele. Não tem nenhum new aqui

        public mostraDado(encapDados e) {
            initComponents();
            this.e = e; //agora sim o objeto vai possuir alguma coisa. vai receber o objeto encapDados que veio por parâmetro
        }
    ....
}

e a classe Principal.java ficaria assim:

import dados.encapDados;
import javax.swing.JOptionPane;

public class Principal extends javax.swing.JFrame {
    encapDados e = new encapDados(); //único lugar que o objeto vai ser criado. única instrução new

	...

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        new mostraDado(this.e).show(); //quando for criar o objeto mostraDado, envia pra ele o objeto encapDados que contém os dados
    }                                        

    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new Principal().setVisible(true);
            }
        });
    }
	
	...
}

Espero que tenha entendido.
[]s

pedroroxd

Foi exatamente o que eu disse, fesaab, mas queria fazer ele pensar sobre o código...
Você pode fazer o que o fesaab sugeriu (eu recomendo) ou o que eu vou passar agora. Chama singleton, alguns axam ele antipatern (eu não), mas algum dia você vai precisar dele, e por isso que colokei desse geito.
Mas fique aki anotado que eu recomendo você fazer igual o fesaab sugeriu.

Na classe Principal você faz isso:
public static encapDados e = new encapDados();

    public static encapDados getEncapDados() {
    	   return e;
    }
E na mostraDado vc troca o encapDados e = new encapDados(); por isso:
encapDados e = Principal.getEncapDados();
Pronto, já funciona perfeitamente. [color=red] Considerações a tomar:[/color] 1) NUNCA crie classes com letra minúscula, por padrões a primeira letra dela é em maiúsculo. Por isso troque o encapDados por EncapDados e o mostraDado por MostraDado 2) NUNCA use o método .show (você faz isso no clique do botão: new mostraDado().show();). Ele foi substituido pelo .setvisible 3) Estude um pouco + sobre orientação a objetos.
hegedus

valeu galera funcionou perfeitamente aqui!!
a unica coisa q nao entendi é que ele tinha q criar isso no mostraDado.java

private mostraDado() { throw new UnsupportedOperationException("Not yet implemented"); }
se nao dava erro.

nao querendo abusar mas já abusando, tem como eu encapsular com vetor? Pq desse jeito eu só posso fazer um cadastro e eu gostaria de criar mais teria como fazer isso?
Obrigado pela ajuda!

pedroroxd

Olha amigo, tem sim…
Vc vai fazer algo do tipo:

ArrayList<encapDados> listaDados   = new ArrayList<encapDados>(); //Cria um ArrayList do tipo Fornecedores

Você vai acrescentando, e depois faz a varredura.

Volto a dizer para você lembrar disso:
[color=red]
Considerações a tomar:[/color]
1) NUNCA crie classes com letra minúscula, por padrões a primeira letra dela é em maiúsculo. Por isso troque o encapDados por EncapDados e o mostraDado por MostraDado
2) NUNCA use o método .show (você faz isso no clique do botão: new mostraDado().show();). Ele foi substituido pelo .setvisible
3) Estude um pouco + sobre orientação a objetos.

Se você quer aprender tudo do básico de java, como uso de listas, vetores, orientação a objeto, banco de dados, baixe a apostila FJ-11 do Caelum, que explica tudo AQUI.

hegedus

Ola consegui faz oq voce disse
o codigo do Principal.java ficou assim:

private void jbCadActionPerformed(java.awt.event.ActionEvent evt) {                                      
        int num;
        
        try{
            num = Integer.parseInt(tfIdade.getText());
            if(num<100){
            lTexto.setText(null);
            
            e.setNome(tfNome.getText());
            e.setSbNome(tfSNome.getText());
            e.setIdade(tfIdade.getText());
            JOptionPane.showMessageDialog(rootPane,"Dados Cadastrados");
            ArrayList<encapDados> listaDados   = new ArrayList<encapDados>();
            listaDados.add(e);
            }else{
                lTexto.setText("Idade Invalida");
            }
        }
        catch(NumberFormatException erro){
            lTexto.setText("cactere invalido");
        }

        catch(Exception erro){
            JOptionPane.showMessageDialog(null,"Nao foi gravado");
        }

    }

ele grava normal, mas nao consigo exibir no MostraDados.java.

public class MostraDado extends javax.swing.JFrame {
    int i;
    encapDados e;
    ArrayList<encapDados> listaDados   = new ArrayList<encapDados>();

        public MostraDado(encapDados e) {
            initComponents();
            this.e = e;

            
            lNome.setText(e.getNome());
            lSNome.setText(e.getSbNome());
            lIdade.setText(e.getIdade());
            
            
        }

tentei algumas alteraçoes, mas nao obtive sucesso.
Obrigado

fesaab

rapaiz… sinceramente eu acho que o que vc tá querendo fazer é “muita areia pro seu caminhão” (nao se sinta ofendido por favor)

você está cometendo erros muito básicos da orientação a objetos, não está sabendo identificar o escopo correto para uma variável, está sofrendo para compartilhar um objeto entre duas classes…

eu sugiro que vc vá um pouco mais devagar e volte um pouco, procure por uma apostila básica de orientação a objetos, depois uma apostila básica de java e por fim uma apostila que fale de swing…

se continuar assim vc não vai aprender direito…
soh tirando suas dúvidas por aqui não dá pra aprender certo…

De novo: não estou querendo ser ofensivo, é apenas um conselho…

pedroroxd

Digo e repito, na apostila do Caelum tem vários exemplos do tipo, depois tem exemplos de conexão com banco de dados…
Tem tudo!

Entre no site do Caelum, vá na parte de apostilas e baixe a FJ-11

Criado 22 de abril de 2010
Ultima resposta 23 de abr. de 2010
Respostas 8
Participantes 3