Setando enable em vários componentes ao mesmo tempo

Bem gente em um frame tenho um Jpanel e nesse jpanel tenho vários JTextFields, por default eu os deixei desabilitados jpanel e jtextfields. Os Jtext fields tem seu estado baseado no estado do jpanel, se o panel carregar desabilitado os textfields tb serão exibidos desabilitados. O que quero fazer é que apenas com um setEnable(true) no JPanel os textfields dele tb se habilitem, sem a necessidade de eu ter que dar setEnable() em cada um.

Valeu gente!

Voce pode criar uma classe tipo ComponentGroup, onde voce armazena em um List todos os componentes que voce quer que tenham o mesmo comportamento e um método setEnabled nessa classe que altera o estado de todos os componentes da lista.

Ummm…

Andei dano uma lida e pelo visto a solução mais elegante para este caso é usar o padrão Observer. Dei uma estudada rápida mas não deu pra entender como aplica-lo nesse meu caso. Teoricamente os JTextFields terão que observar o estado Enabled do JPanel e quando esse mudar os JTextFields serão avisados e tb mudarão seu estado para enable. Mas isso é uma teoria não sei como aplicar isso na prática, alguém poderia me dar um exemplo da aplicação do observable nesse caso? Um frame com um JPanel e alguns TextFields só pra eu ter uma idéia.

Valeu gente.

Cara, acredito que observer não venha a esse caso.

O que eu disse sobre o Group seria mais ou menos o seguinte.

public class ComponentGroup {
private List<JComponent> comps;
public ComponentGroup(){
comps = new ArrayList<JComponent>();
}
public void add(JComponent comp){
comps.add(comp);
}
public void setEnabled(boolean flag){
for(JComponent comp : comps)
 comp.setEnabled(flag);
}
}

E na sua tela teria algo assim.

public void initComponents(){
JPanel panel = new JPanel();
//Cria varios jtextfields aqui e adiciona no panel
ComponentGroup cGroup = new ComponentGroup();
cGroup.add(textField1);
cGroup.add(textField2);
cGroup.add(textField3);
cGroup.add(textField4);
cGroup.add(textField5);
cGroup.add(textField6);
}

Quando voce fizer cGroup.setEnabled(true) todos os componentes da lista serão ativados e quando false todos serão desativados.

[RESOLVIDO PORÉM NÃO ENTENDIDO]

Eu entendi a dica que você deu, porém não queria ter que envolver estruturas de repetições para esse caso, não sei se estou errado no meu modo de penssar mas acho que repetições ocupam mais memória e mais trabalho do processador.

Bem olha só, fuçando no proprio NetBeans descrobri a solução.

Selecionei o JTextField botão direito do mouse->propriedades->vinculação->observavel->editable. Ai em “origem da vinculação” selecionei o JPanel e em “expressão de vinculação” escolhi enabled boolean que fez aparecer ${enabled}.

Pronto funcionou…

Quando dou um setEnabled(true) no JPanel os JTextFields são habilitados automaticamente.

Resolvi olha o código para ver o que foi que o NetBeans fez ai me deparei com isso

org.jdesktop.beansbinding.Binding binding = 
org.jdesktop.beansbinding.Bindings.createAutoBinding(org.jdesktop.beansbinding.AutoBinding.UpdateStrategy.READ_WRITE, jpcampos, 
org.jdesktop.beansbinding.ELProperty.create("${enabled}"), jtfcnpj, org.jdesktop.beansbinding.BeanProperty.create("editable"));
        bindingGroup.addBinding(binding);

Nunca vi esse codigo antes, não conheço a tal classe Binding nem o que ela faz, alguém poderia dar uma expplicada se for possivel.

Valeu gente.

É, beans binding já é algo bem mais interessante.

Ele praticamente coloca um observer na classe do JPanel que quando chamado invoca os listeners com o novo valor.

Eu não vou entrar no mérito do BeansBinding mas voce pode dar uma pesquisada que voce vai encontrar bastante material.