Acessar Componentes em Outro Pacote

8 respostas
D

Olá pessoal,

Estou com uma dúvida. Estou fazendo um projeto.
No pacote Visao fiz a classe para a interface gráfica.
No pacote Controle a classe que trata dos eventos.

Gostaria de saber se tem como, na classe que trata os eventos ter acesso direto a um textField (que está no pacote Visao), por exemplo.

tipo:
tfNome.getText…

Tentei deixar publico o TextField… e mesmo assim não deu certo…

Alguém sabe se há alguma forma de ter acesso ao componente em outro pacote?
Obrigada…

8 Respostas

D

Hummm…

Acho que achei como resolver esse problema…

Basta escrever…:
Classe1 extends Classe2 …

:slight_smile:

Ironlynx

Na verdade, é só vc importar esse pacote!(E garantir que há acesso a variáveis das classes…se são públicas,protegidas…) :lol:

Se a variável for estática vc pode ter acesso direto a ela, mas acho que esse não é o ponto.Ficar navegando diretamente variáveis entre uma classe e outra fere o encapsulamento das mesmas.Separe estado e funcionalidade dos seus componentes, e avalie a necessidade de mecanismos de binding(ligação) para o controle dos seus componentes.Uma dica é usar padrões(ou soluções) como AbstractAction e Observers, aí vão algumas dicas(há codigos lá):

http://java.sun.com/docs/books/tutorial/uiswing/misc/action.html
http://www.javacamp.org/designPattern/mediator.html
http://www.javacamp.org/designPattern/observer.html

bcartaxo

A forma mais natural de se tratar eventos em java é através das classes internas (inner class). ao invés de vc separar as classes de evento das classes de interface gráfica, faça das classes de evento (o nome mais correto seria classes ouvintes ou listenners) classes internas da sua classe de interface gráfica. nenhuma das soluções q vc falou são recomendadas, nem deixar atributos publicos, nem tuas classes ouvintes estenderem das classes de interface gráfica. aconselho vc a dar uma olhada em classes internas, que é um conceito um tanto chato pra quem ta iniciando, mas é preciso.

[]´s

D

Andei pesquisando aqui no GUJ… e tem esse link:
http://www.guj.com.br/posts/list/10730.java#56088
Hum… isso seria mais ou menos assim, por exemplo…:

public class A { private int atributo = 20; private class B { void print () { System.out.println("atributo=" + atributo); } } }

To com uma dúvida… Isso não deixaria o código mto… “misturado”?!

Ironlynx, lerei os sites que vc mandou…

Obrigada pelas respostas :slight_smile:

bcartaxo

classes aninhadas (internas ou inner class) são artifícios naturalmente confusos, porém necessários. oq vc deve fazer é tentar estrutura-las da melhor forma possível, com um tempo vc se acostuma e consegue estruturar de forma legível.

D

OK…

Obrigada pela resposta!
:slight_smile:

ViniGodoy

Com tanta modularização, não é recomendável que haja uma forma de se ter acesso direto. A solução com extends também não é recomendável. Só use extends quando houver uma relação é um entre a classe pai e a filha. Ou seja, quando o filho é um objeto do tipo do pai.

Como a classe de controle geralmente é intimamente relacionada com a visão, o ideal é você partir mesmo para uma inner class, como explicaram os colegas.

Se você ainda pretende manter o código separado, uma das alternativas é criar um atributo na sua classe de controle para o JTextField e passa-lo como parâmetro no momento da construção. Ficaria mais ou menos assim:

public void ControleTexto implements ActionListener {
    private JTextField txtField;

    public ControleTexto (JTextField txtField) {
          this.txtField = txtField;
    }

    public void actionPerformed(ActionEvent e) {
         //Faz qualquer coisa no JTextField
    }
}
Depois, na hora de criar:
JTextField texto1 = new JTextField();
//Passamos o texto 1 para o TextoController.
texto1.addActionListener(new TextoController(texto1));
D

Vini, mto mto mto obrigada…!!!

Mto obrigada mesmo!
:slight_smile: Como sempre, perfeito em suas explicações!

Obrigada a todos…
Dina

Criado 19 de novembro de 2007
Ultima resposta 19 de nov. de 2007
Respostas 8
Participantes 4