2010-04-26 12 views
17

Ho diversi JComponent s su un JPanel e voglio disabilitare tutti quei componenti quando premo un pulsante Start.Java Swing - Come disabilitare un JPanel?

Al momento, sto disabilitando tutti i componenti in modo esplicito da

component1.setEnabled(false); 
: 
: 

ma c'è comunque con il quale è possibile disattivare tutti i componenti in una sola volta? Ho provato a disattivare il JPanel in cui questi fattori si aggiungono

panel.setEnabled(false); 

ma non ha funzionato.

+0

Perché qualcuno dovrebbe fare Questo? Sembra più facile mettere i componenti Swing su un JDialog invisibile quando l'utente fa clic sul pulsante Ok (che può essere rinominato Start). –

risposta

21

Il pannello deve avere un metodo che può essere utilizzato in un ciclo per disabilitare i sottocomponenti senza nominarli esplicitamente.

+0

+1 Ho usato questo. Tuttavia, se i componenti secondari sono contenitori (ad esempio caselle utilizzate per la gestione del layout), è necessario farlo in modo ricorsivo. Inoltre, se si hanno componenti disattivati ​​per altri motivi, la riattivazione li sconfiggerà. – staticman

+1

D'accordo con staticman, è un comportamento pericoloso e hai bisogno di cure quando lo usi perché riattiverai tutto se non prendi qualche precauzione. Forse non è un problema per il tuo caso, quindi puoi farlo. O se è un pb, allora probabilmente dovrai memorizzare gli stati dei componenti prima di disattivarli per reimpostarli nello stato buono. –

+0

È un po 'complicato, ma non direi pericoloso. Il mio approccio normale sarebbe quello di sottoclasse 'JPanel' e sovrascrivere il metodo' setEnabled() '. Lì vorrei abilitare/disabilitare manualmente i sottocomponenti appropriati, in base allo stato interno. – ZeissS

3

Il Disabled Panel fornisce supporto per due approcci. Uno per disabilitare ricorsivamente i componenti, l'altro per "dipingere" il pannello con un aspetto disabilitato.

2

Il seguente metodo utilizza la ricorsione per ottenere ciò. Passa a qualsiasi Container e questo metodo restituirà un array Component di tutti i componenti non container situati ovunque "all'interno" dello 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()]); 
     } 
    } 

Passare semplicemente attraverso gli elementi dell'array restituito e disabilitare i componenti.

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

il seguente metodo dovrebbe essere tutto ciò che è necessario aggiungere, si può chiamare 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

se si sposta la prima istruzione 'container.setEnabled (enable)' all'interno del catch, allora si potrebbe mantenere una certa funzionalità dei contenitori, ad es. 'JTabbed' potrebbe ancora essere cliccabile. –

+0

inoltre, fai attenzione perché se un elemento dovesse rimanere disabilitato nel ciclo di abilitazione, allora questo metodo annullerebbe tutto. –

0

disattivazione dovrebbe avvenire in modo ricorsivo:

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())); 
    } 
} 
Problemi correlati