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…
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á):
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.
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
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
dina
OK…
Obrigada pela resposta!
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:
publicvoidControleTextoimplementsActionListener{privateJTextFieldtxtField;publicControleTexto(JTextFieldtxtField){this.txtField=txtField;}publicvoidactionPerformed(ActionEvente){//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
dina
Vini, mto mto mto obrigada…!!!
Mto obrigada mesmo! Como sempre, perfeito em suas explicações!