Selecionar todas as imagens no laço for

Meus caros colegas

Estou tentando implementar uma função que selecione todas as imagens que o laço for gera e faça alguma função com elas (ex: setar a borda, deixar desativado), porém quando executo minha aplicação ela seleciona apenas os últimos botões com imagens, mas não os primeiros. Peço desculpas pelo código um tanto quanto primário pois sou novo nesta área, apesar da idade da linguagem.
Segue o cod.

import java.awt.BorderLayout;  
import java.awt.Component;  
import java.awt.FlowLayout; 
import java.awt.event.ActionEvent;  
import java.awt.event.ActionListener;  
import javax.swing.ImageIcon;
  
import javax.swing.JButton;  
import javax.swing.JFrame;  
import static javax.swing.JFrame.EXIT_ON_CLOSE;
import javax.swing.JPanel;   
  
public class Selecionar extends JFrame {  

    private JPanel jpanel;
    private JButton btnselecionar;
    private JPanel jpanelFixo;
   
    public Selecionar() {
    super("Selecionando Imagens");  
    setDefaultCloseOperation(EXIT_ON_CLOSE);  
    //setLayout(null);  
    setSize(800, 600);
    
    /*********************************************/
    
    int qtdLoop = 2;
    jpanelFixo = new JPanel();
    
    for (int x=0;x<qtdLoop;x++){//2 GIROS
    
    jpanel = new JPanel(new FlowLayout(FlowLayout.LEFT, 11,20));
    btnselecionar = new JButton("Marcar");
        for (int i = 0; i < 3; i++) {
            jpanel.add(new JButton(new ImageIcon("img/iconecadastro2.png")));
        }
    jpanelFixo.add(btnselecionar, BorderLayout.SOUTH);
    jpanelFixo.add(jpanel);
  
    }//FIM DO LAÇO
    
    add(jpanelFixo, BorderLayout.CENTER);
  
    btnselecionar.addActionListener(new ActionListener() {
  
        public void actionPerformed(ActionEvent e) {
        Component componentes[] = jpanel.getComponents();
        
        for (Component c : componentes) {
            if (c instanceof JButton) {
                if(((JButton) c).isEnabled() == true){
                    ((JButton) c).setEnabled(false);
                }else{
                    ((JButton) c).setEnabled(true);
                }
            }
        }
    }
    });  
    
    }  
  
    public static void main(String[] args) {  
    new Selecionar().setVisible(true);  
    }
}

É que você só está obtendo os botões do jpanel.
Você também adicionou botões no jpanelFixo.

Dica, troque esse if:

            if(((JButton) c).isEnabled() == true){
                ((JButton) c).setEnabled(false);
            }else{
                ((JButton) c).setEnabled(true);
            }

Por isso:

JButton botao = (JButton) c;
botao.setEnabled(!botao.isEnabled());

Staroski obrigado pela sua resposta.

Coloquei conforme comentou sobre o if e modifiquei para pegar o jpanelFixo ele ficou assim:

public void actionPerformed(ActionEvent e) {
    Component componentes[] = jpanelFixo.getComponents();
    
    for (Component c : componentes) {
            if (c instanceof JButton) {
            JButton botao = (JButton) c;
            botao.setEnabled(!botao.isEnabled());
         }
    }
}

A função setEnabled marcou meus 2 botões com evento para false porém não os botões do jpanel. Vê se pode isso! Vlw pela dica.

É que agora você só está pegando os botões do jpanelFixo e não do jpanel.
Antes tu só pegava do jpanel e não pegava do jpanelFixo.

Você precisa pegar os botões de ambos.

Desculpe minha burrice, mas como eu pegaria esses jbuttons e mudaria o status deles estando dentro de outro jpanel criado no meu laço, seria com o instanceof?

if (c instanceof JButton)

Vlw pelas dicas

Fazendo exatamente a mesma coisa, só que para os dois JPanels, não apenas um deles.
Você tem que desabilitar os botões do jpanel e os botões do jpanelFixo.

public void actionPerformed(ActionEvent e) {
    trocaEstadoBotoes(jpanel);
    trocaEstadoBotoes(jpanelFixo);
}

private void trocaEstadoBotoes(JPanel container) {
    Component componentes[] = container.getComponents();
    for (Component c : componentes) {
        if (c instanceof JButton) {
            JButton botao = (JButton) c;
            botao.setEnabled(!botao.isEnabled());
        }
    }
}
1 curtida

Obrigado pela resposta Staroski!

Fiz da seguinte maneira, segue uma demonstração de como ficou:

Foto com Resultado

Segue o código:

import java.awt.BorderLayout;  
import java.awt.Component;  
import java.awt.FlowLayout; 
import java.awt.event.ActionEvent;  
import java.awt.event.ActionListener;  
import javax.swing.ImageIcon;
  
import javax.swing.JButton;  
import javax.swing.JFrame;  
import static javax.swing.JFrame.EXIT_ON_CLOSE;
import javax.swing.JPanel;   
import javax.swing.border.Border;
import javax.swing.border.LineBorder;
  
public class Selecionar extends JFrame implements ActionListener{  

    private JPanel jpanel;
    private JButton btnselecionar;
    private JPanel jpanelFixo;
    Border border = LineBorder.createGrayLineBorder();
   
    public Selecionar() {
    super("Selecionando Imagens");  
    setDefaultCloseOperation(EXIT_ON_CLOSE);  
    //setLayout(null);  
    setSize(800, 600);
    
    /*********************************************/
    
    int qtdLoop = 2;
    jpanelFixo = new JPanel();
    
    for (int x=0;x<qtdLoop;x++){//2 GIROS
    
    jpanel = new JPanel(new FlowLayout(FlowLayout.LEFT, 11,20));
    btnselecionar = new JButton("Marcar");
    
        for (int i = 0; i < 3; i++) {
            jpanel.add(new JButton(new ImageIcon("img/java.png")));
        }
    
    btnselecionar.addActionListener(this);
    jpanelFixo.add(btnselecionar, BorderLayout.SOUTH);
    jpanelFixo.add(jpanel);
  
    }//FIM DO LAÇO
    
    add(jpanelFixo, BorderLayout.CENTER);
  
    }
    
    public void actionPerformed(ActionEvent e) {
    trocaEstadoBotoes(jpanel);
    trocaEstadoBotoes(jpanelFixo);
    }

    private void trocaEstadoBotoes(JPanel container) {
    Component componentes[] = container.getComponents();
        for (Component c : componentes) {
            if (c instanceof JButton) {
                JButton botao = (JButton) c;
                botao.setEnabled(!botao.isEnabled());
            }
        }
    }
    
    public static void main(String[] args) {  
    new Selecionar().setVisible(true);  
    }
}

Infelizmente ele não pega o primeiro jpanel nem com sua solução :confounded::confounded:
Fiz alguma coisa (além de tudo) errado?
Vlw pelas dicas

Segue uma foto de como esta mostrando ao executar o codigo acima

No seu laço abaixo, na segunda passada, você está matando as variáveis que criou na primeira passada:

for (int x = 0; x < qtdLoop; x++) {// 2 GIROS

1 curtida

Na realidade eu iria utilizar esse laço para mostrar varios jpanels (separados por data) vindo de uma consulta sql. Teria alguma outra forma de realizar este procedimento de forma pratica sem ter que aumentar o numero de linhas copiadas e coladas (por ex: se eu copiar e colar varios jpanels manualmente em visible(false))?

Vlw pelas dicas

Consegui fazer o que eu queria de uma outra forma, porém não sinto que meu código esta pratico, da maneira encontrada tem muitos if implementados no ActionListener, tens alguma idéia? Lembrando que precisa ser dinâmico pois terei de implementar vários painéis como este:

private JPanel jpanel[] = new JPanel[2];

vindo de um arraylist ex:

private List resultadoConsultaSql = new ArrayList();
private JPanel jpanel[] = new JPanel[resultadoConsultaSql.size()];

Segue meu código:

import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JToggleButton;

public class Selecionar extends JFrame{  
    private JPanel jpanel[] = new JPanel[2];
    private JButton jbutton[][] = new JButton[jpanel.length][3];
    private JToggleButton btnselecionar[] = new JToggleButton[jpanel.length];
    private JPanel jpanelFixo;
    
    public Selecionar() {
    	super("Selecionando Imagens");  
    	setDefaultCloseOperation(EXIT_ON_CLOSE);  
    	//setLayout(null);  
    	setSize(800, 600);

    	ActionListener listener = new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
                if (e.getSource() instanceof JToggleButton) {
                    String text = ((JToggleButton) e.getSource()).getActionCommand();
                    JToggleButton jb = ((JToggleButton) e.getSource());
                    //JOptionPane.showMessageDialog(null, text);
                    int valor = Integer.parseInt(text);
                    
                    if(valor == 0){
                        int max = 1;
                        for (int i = 0; i < max; i++) {    
                            for(int j = 0; j < 3; j++) {
                              if(jb.isSelected() == true ){
                                jbutton[i][j].setEnabled(false);
                              }else{
                                jbutton[i][j].setEnabled(true);
                              }
                            }
                        }   
                    }
                    if(valor == 1){
                        int max = 2;
                        for (int i = valor; i < max; i++) {
                            for(int j = 0; j < 3; j++) {
                              if(jb.isSelected() == true ){
                                jbutton[i][j].setEnabled(false);
                              }else{
                                jbutton[i][j].setEnabled(true);
                              }
                            }
                        }   
                    }
                }
            }
        };
        
   	jpanelFixo = new JPanel();
        
    	for (int x=0;x<jpanel.length;x++) {
            jpanel[x] = new JPanel(new FlowLayout(FlowLayout.LEFT, 11,20));
            btnselecionar[x] = new JToggleButton();//selectall_icon.png
            btnselecionar[x].setIcon(new javax.swing.ImageIcon(getClass().getResource("/img/selectall_icon.png")));
            btnselecionar[x].setActionCommand(String.valueOf(x));
            btnselecionar[x].addActionListener(listener);
            for (int i = 0; i < 3; i++) {
            jbutton[x][i] = new JButton();
            jbutton[x][i].setIcon(new javax.swing.ImageIcon(getClass().getResource("/img/java.png")));
            jpanel[x].add(jbutton[x][i]);
            //jpanel.add(new JButton(new ImageIcon("img/java.png")));
            }
            jpanelFixo.add(jpanel[x]);
            jpanelFixo.add(btnselecionar[x], BorderLayout.SOUTH);
    	}//FIM DO LAÇO
    	add(jpanelFixo, BorderLayout.CENTER);
    }
    public static void main(String[] args) {
        new Selecionar().setVisible(true);  
    }
}

Desde já agradeço toda ajuda recebida @staroski

Realmente não está prático.
Programação orientada à objetos preza pela reutilização.
Criar uma classe que estenda JPanel e tenha o botão selecionar e as 3 imagens.
Aí é só você instanciar e adicionar objetos dessa nova classe ao invés de repetir o mesmo código diversas vezes.

1 curtida