martes, 1 de noviembre de 2011

Habilitar/deshabilitar componentes de un Panel en Java

Hola.

En ocasiones sucede que necesitamos deshabilitar todos los componentes de un JPanel o un JFrame por alguna razón. Además tenemos botones, etiquetas, sliders, cajas de texto... y tenemos que hacer por cada componente setEnable(true/false), pero como buenos programadores esa opción no nos agrada, así que buscamos y el buen Google nos da la solución rápidamente:

@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 lo que hace es sobreescribir el método setEnabled() del componente de tal forma que cuando se llame al método primero se activará/desactivará el propio componente y posteriormente habilita/deshabilita todos los componentes en él con la llamada a setComponentsEnabled.

Pero esto de pegar el par de métodos en cada componente como que no parece lo mejor, porque no mejor hacer lo siguiente:

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);
  }
  
 }        
} 
 así podemos dejar el método digamos en una clase SwingUtils y cuando necesitemos habilitar/deshabilitar un componente y todos sus hijos únicamente haríamos una llamada así:

SwingUtils.setEnableContainer(miComponente, true);
SwingUtils.setEnableContainer(miComponente, false); 

y listo.

SwingUtils.java

5 comentarios:

  1. Muchas gracias, es perfecto para lo que necesitaba, te agradezco!.

    Saludos

    ResponderEliminar
  2. Saludos y muchas gracias por el aporte, esta muy bueno y funciona.
    Pero tengo un requerimiento adicional
    En una aplicación que estoy haciendo, necesito que se deshabiliten algunos formularios dependiendo del usuario logueado, por eso cuando hago este llamado:
    setEnableContainer(miComponente, true);
    "miComponente" lo extraigo de una BD pero viene una cadena y no he podido aplicar tu metodo con esa restriccion.
    Espero haberme dado a entender y que me puedas ayudar

    ResponderEliminar
  3. ¡Excelente!
    Y que conste que "el buen Google" no me dio la solución rápidamente hasta que entre aquí.
    Saludos

    ResponderEliminar
  4. Este comentario ha sido eliminado por el autor.

    ResponderEliminar