2010-04-26 12 views
17

Tengo varios JComponent en un JPanel y quiero desactivar todos esos componentes cuando presiono un botón de Inicio.Java Swing: cómo deshabilitar un JPanel?

En la actualidad, estoy Desactivación de todos los componentes explícitamente por

component1.setEnabled(false); 
: 
: 

Pero hay alguna forma por la cual puedo desactivar todos los componentes a la vez? He intentado desactivar el JPanel en que estos componentes se añaden por

panel.setEnabled(false); 

pero no funcionó.

+0

Por qué alguien haría ¿esta? Parece más fácil colocar los componentes Swing en un JDialog que invisibiliza cuando el usuario hace clic en el botón Aceptar (que puede renombrarse como Inicio). –

Respuesta

21

El panel debe tener un método getComponents() que se puede utilizar en un bucle para deshabilitar los subcomponentes sin nombrarlos explícitamente.

+0

+1 Lo he usado. Sin embargo, si sus subcomponentes son contenedores (por ejemplo, cajas utilizadas para la administración del diseño), entonces debe hacerlo recursivamente. Además, si tiene componentes que se desactivan por otros motivos, al volver a habilitarlos se les anulará. – staticman

+1

De acuerdo con staticman, es un comportamiento peligroso y necesita cuidado cuando lo usa porque lo volverá a habilitar todo si no toma precauciones. Tal vez no es un problema para su caso, entonces puede gustarle esto. O si es un pb, entonces probablemente tendrá que memorizar los estados de los componentes antes de deshabilitarlos para restablecerlos en buen estado. –

+0

Es un poco complicado, pero no diría peligroso. Mi enfoque normal sería subclasificar 'JPanel' y sobrescribir el método' setEnabled() '. Allí habilitaría/inhabilitaría manualmente los subcomponentes apropiados, en función del estado interno. – ZeissS

3

El Disabled Panel proporciona soporte para dos enfoques. Uno para deshabilitar recursivamente los componentes, el otro para "pintar" el panel con un aspecto deshabilitado.

2

El siguiente método usa la recursión para lograr esto. Pase cualquier Container, y este método devolverá una matriz Component de todos los componentes que no son contenedores ubicados en cualquier lugar "dentro" del Container.

private Component[] getComponents(Component container) { 
     ArrayList<Component> list = null; 

     try { 
      list = new ArrayList<Component>(Arrays.asList(
        ((Container) container).getComponents())); 
      for (int index = 0; index < list.size(); index++) { 
       for (Component currentComponent : getComponents(list.get(index))) { 
        list.add(currentComponent); 
       } 
      } 
     } catch (ClassCastException e) { 
      list = new ArrayList<Component>(); 
     } 

     return list.toArray(new Component[list.size()]); 
     } 
    } 

Simplemente recorra los elementos de la matriz devuelta y deshabilite los componentes.

for(Component component : getComponents(container)) { 
    component.setEnabled(false); 
} 
0

El método siguiente debería ser todo lo que hay que añadir, se le puede llamar con setEnableRec(panel, true) o setEnableRec(panel, false):

private void setEnableRec(Component container, boolean enable){ 
    container.setEnabled(enable); 

    try { 
     Component[] components= ((Container) container).getComponents(); 
     for (int i = 0; i < components.length; i++) { 
      setEnableRec(components[i], enable); 
     } 
    } catch (ClassCastException e) { 

    } 
} 
+0

si mueve la primera instrucción 'container.setEnabled (enable)' dentro del catch, entonces podría mantener cierta funcionalidad de los contenedores, p. 'JTabbed' aún podría ser clickeable. –

+0

también tenga cuidado porque si un elemento debería haberse mantenido inhabilitado en el bucle de habilitación, este método anularía todo. –

0

Desactivación debería producirse de forma recursiva:

Queue<Component> queue = new LinkedList<>(Arrays.asList(container.getComponents())); 
while(!queue.isEmpty()) { 
    Component head = queue.poll(); 
    head.setEnabled(enable); 
    if(head instanceof Container) { 
     Container headCast = (Container) head; 
     queue.addAll(Arrays.asList(headCast.getComponents())); 
    } 
} 
Cuestiones relacionadas