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
Muchas gracias, es perfecto para lo que necesitaba, te agradezco!.
ResponderEliminarSaludos
Saludos y muchas gracias por el aporte, esta muy bueno y funciona.
ResponderEliminarPero 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
¡Excelente!
ResponderEliminarY que conste que "el buen Google" no me dio la solución rápidamente hasta que entre aquí.
Saludos
Este comentario ha sido eliminado por el autor.
ResponderEliminarExcelente herramienta, muchas gracias!
ResponderEliminar