Pegar todos JButton do JPanel

4 respostas
A

Ola Pessoal
tem jeito de eu pegar todos os JButton de um JLabel e deixar todos com .setEnabled(false) ???

se sim, algum poderia em falar como?

valeu

4 Respostas

D

Talvez o seu problema seja resolvido com o seguinte:

Component[] c = meujpanel.getComponents();

for (int i = 0; i < c.length; i++) {
  if (c[i] instanceof JButton) { // faca algo }
}

A seguinte instrução devolve o número de componentes no container (no seu caso o JPanel):

int n = meujpanel.getComponentCount();

Espero ter ajudado.

D

Blz!
Quando eu postei a resposta, não tinha tanta certeza (eu estava fora do meu “habitat”) :mrgreen: Chegando agora no escritório eu testei (por que sabia da existência de getComponentCount() e de getComponents() mas achava que talvez pudesse obter um iterador, que seria muito melhor que lidar com um array…, mas não tem – pelo menos não achei).

Você obtém um array de Component existentes no Container (no caso o JPanel) assim:

Component[] comp = meuJPanel.getComponents();

daí vc pode percorrer os elementos do array normalmente (com um for()). Para desabilitar apenas os JButtons use o seguinte (dentro do bloco for()):

if (comp[i] instanceof JButton) { JButton b = (JButton)comp[i]; b.setEnabled(false); // ou true... }

Tendeu?! Se você quiser tenho um programinha “de brinquedo” que fiz pra testar isso, eu te mando. :slight_smile:

A

Ola dango
obrigado pela ajuda
eu entendi sim

unica coisa que eu nao entendi foi
JButton b = (JButton)comp[i];
b.setEnabled(false); // ou true…

mais precisamente a linha
JButton b = (JButton)comp[i];

o que realmente essa linha faz?

mas eu entendi
valeu pela ajuda

D

Isso é um casting (conversão explícita de tipo).

Como você obteve um array de Component, cada elemento desse array pode ser qualquer objeto que extenda a classe Component (JButton, JCheckBox, JComboBox, JList -- não diretamente, pois extendem, na verdade, JComponent, que por sua vez, extende a classe Container, que extende Component):

Component -> Container -> JComponent -> JButton, JCheckBox, ...

Sendo assim, quando você verifica que o i-ésimo elemento do array é um JButton if (comp[i] instanceof JButton), então você aplica uma conversão explícita de tipo (casting) para o JButton.

Na verdade, se você fizer comp[i].setEnabled(...), também funciona.

Ocorre que, se você tiver um outro método que receba como argumento um JButton (explicitamente) então você não poderá passar comp[i] e deverá converter explicitamente:

// ...
    metodoQualquer(comp[i]);     // falhara na compilacao
      // ...

private void metodoQualquer(JButton b) { /*...*/ }

O código acima funcionará se você fizer uma chamada assim: metodoQualquer((JButton)comp[i]); então funcionará!

Espero ter ajudado.

Criado 11 de janeiro de 2003
Ultima resposta 14 de jan. de 2003
Respostas 4
Participantes 2