A veces nos encontramos en la situación en que deseamos deshabilitar los componentes de un JFrame o un JPanel. Entonces lo que tenemos que hacer por cada componente es un setEnable(true/false), pero esto no pararece ser una buena idea, ya que ocasiona que tengamos código repetido, así que luego de buscar en "San Google" encontramos la solución:
@Override
public void setEnabled(boolean en) {
    super.setEnabled(en);
    setComponentsEnabled(this, en);
}
private void setComponentsEnabled(java.awt.Container c, boolean en) {
    Component[] components = c.getComponents();
    for (Component comp: components) {
        if (comp instanceof java.awt.Container)
            setComponentsEnabled((java.awt.Container) comp, en);
        comp.setEnabled(en);
    }
}
Esto sobreescribe el método setEnabled() del componente de forma tal que cuando se llame al método primero se activará/desactivará el propio componente y luego habilitará/deshabilitará todos los componentes en él con la llamada a setComponentsEnabled.

Pero como no parece muy buena idea esto de estar copiando y pegando el par de métodos en cada componente, entonces lo que podemos hacer es:
public static void setEnableContainer(Container c, boolean band) {

    Component [] components = c.getComponents();
    c.setEnabled(band);
    for(int i = 0; i < components.length; i++) {
        components[i].setEnabled(band);

        if(components[i] instanceof Container) {
            setEnableContainer((Container)components[i], band);
        }
    }
}
De esta manera podríamos dejar el método por ejemplo en una clase SwingUtils y así cuando necesitemos habilitar/deshabilitar algún componente y todos sus hijos, lo que haríamos es simplemente hacer una llamada como la siguiente:
SwingUtils.setEnableContainer(miComponente, true);
SwingUtils.setEnableContainer(miComponente, false);

0 Comentarios:

Dejar un comentario

Los comentarios están siendo moderados y serán publicados a la brevedad.