Ir ao conteúdo
  • Cadastre-se

Java Selecionar todas as imagens no laço for


Posts recomendados

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);  
    }
}

 

Link para o comentário
Compartilhar em outros sites

Pelo que testei, o getComponent() realmente não está retornando todos os JButtons.

 

Você pode adotar outra medida, que é usando um vetor de JButton, por exemplo:

 

JButton botões[] = new JButton[3];
for(int i = 0; i < botões.length; i++)
{
	botões[i] = new JButton(new ImageIcon("img/iconecadastro2.png"));
  	jpanel.add(botões[i]);
}

Por fim, você apenas substitui o laço para percorrer o vetor botões.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@Rondinelli Fotx Olá. Cara, eu não programo em Java Swing. Mas seguindo o q o @iHollyZinhO mencionou, daria para fazer uso de um vetor de JButton juntamente com um vetor de Strings, onde, cada elemento desse vetor de String se refere a uma imagem.

As imagens pelo q testei aqui abriram, mas não sei se é isso mesmo q você quer. Teria q testar aí:

private String[] images = { "src/Stop.png", "src/Pause.png", "src/Play.png" }; // aqui peguei 3 imagens para testar
private JButton botões[] = new JButton[3];

E aí no seu for daria para fazer isso:

for (int i = 0; i < 3; i++) {
    botões[i] = new JButton(new ImageIcon(images[i]));
    jpanel.add(botões[i]);                           
}        

Não sei se é isso q você quer. Qualquer coisa é só falar, ok?

Só q aqui carregaram 6 imagens, 2 de cada q coloquei. Me parece q não é bem isso q deveria acontecer (!?)

Link para o comentário
Compartilhar em outros sites

Obrigado senhores @iHollyZinhO e @giu_d  pela resposta.

 

Fiz algo similar aos que vocês mencionaram. Porém minha aplicação continua apenas pegando o ultimo valor do jpanel do laço (ou seja se clico no jbutton "marcar" do primeiro laço, ele desativa as imagens do segundo jpanel, o mesmo ocorre se eu clicar no jbutton "marcar" do segundo laço). Se fiz algo errado podem me crucificar!

 

Segue uma foto com minha aplicação;

 

Segue meu 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{  

    private JPanel jpanel;
    private JButton btnselecionar;
    private JPanel jpanelFixo;
    private JButton botões[] = new JButton[3];
    
    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 < botões.length; i++) {
            botões[i] = new JButton(new ImageIcon("img/java.png"));
            jpanel.add(botões[i]);
            //jpanel.add(new JButton(new ImageIcon("img/java.png")));
        }
    
    btnselecionar.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent evt) {
                for (int i=0;i<botões.length;i++){
                    botões[i].setEnabled(false);
                    btnselecionar.setEnabled(false);
                }
            }
    });
    jpanelFixo.add(btnselecionar, BorderLayout.SOUTH);
    jpanelFixo.add(jpanel);
  
    }//FIM DO LAÇO
    
    add(jpanelFixo, BorderLayout.CENTER);
        
    }
    
    public static void main(String[] args) {  
    new Selecionar().setVisible(true);  
    }
}

 

erro.jpg

Link para o comentário
Compartilhar em outros sites

Em 19/08/2018 às 16:35, Rondinelli Fotx disse:

Obrigado senhores @iHollyZinhO e @giu_d  pela resposta.

 

Fiz algo similar aos que vocês mencionaram. Porém minha aplicação continua apenas pegando o ultimo valor do jpanel do laço (ou seja se clico no jbutton "marcar" do primeiro laço, ele desativa as imagens do segundo jpanel, o mesmo ocorre se eu clicar no jbutton "marcar" do segundo laço). Se fiz algo errado podem me crucificar!

 

Segue uma foto com minha aplicação;

 

Segue meu 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{  

    private JPanel jpanel;
    private JButton btnselecionar;
    private JPanel jpanelFixo;
    private JButton botões[] = new JButton[3];
    
    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 < botões.length; i++) {
            botões[i] = new JButton(new ImageIcon("img/java.png"));
            jpanel.add(botões[i]);
            //jpanel.add(new JButton(new ImageIcon("img/java.png")));
        }
    
    btnselecionar.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent evt) {
                for (int i=0;i<botões.length;i++){
                    botões[i].setEnabled(false);
                    btnselecionar.setEnabled(false);
                }
            }
    });
    jpanelFixo.add(btnselecionar, BorderLayout.SOUTH);
    jpanelFixo.add(jpanel);
  
    }//FIM DO LAÇO
    
    add(jpanelFixo, BorderLayout.CENTER);
        
    }
    
    public static void main(String[] args) {  
    new Selecionar().setVisible(true);  
    }
}

 

erro.jpg

O problema é que você está usando um for onde você comentou "DOIS GIROS", e neste você está instanciando novamente o vetor e adicionando no painel, fazendo com que os botões que foram instanciados na primeira iteração sejam perdidos.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@iHollyZinhO

26 minutos atrás, iHollyZinhO disse:

O problema é que você está usando um for onde você comentou "DOIS GIROS", e neste você está instanciando novamente o vetor e adicionando no painel, fazendo com que os botões que foram instanciados na primeira iteração sejam perdidos.

 

Na verdade eu uso o "DOIS GIROS" justamente porque minha aplicação vai apresentar varios jpanels com os botões de imagens. Eles serão adicionados automaticamente de acordo com uma consulta sql que irei realizar, não consigo imaginar outra forma de adicioná-los a não ser com laço for. Você pode me dar uma luz? Obrigado.

Link para o comentário
Compartilhar em outros sites

46 minutos atrás, Rondinelli Fotx disse:

@iHollyZinhO

 

Na verdade eu uso o "DOIS GIROS" justamente porque minha aplicação vai apresentar varios jpanels com os botões de imagens. Eles serão adicionados automaticamente de acordo com uma consulta sql que irei realizar, não consigo imaginar outra forma de adicioná-los a não ser com laço for. Você pode me dar uma luz? Obrigado.

Você pode usar um vetor de JPanel e uma matriz de JButton, por exemplo:

public class Selecionar extends JFrame{  
    private JPanel jpanel[] = new JPanel[2];
    private JButton btnselecionar;
    private JPanel jpanelFixo;
    private JButton botões[][] = new JButton[2][3];
    
    public Selecionar() {
    	super("Selecionando Imagens");  
    	setDefaultCloseOperation(EXIT_ON_CLOSE);  
    	//setLayout(null);  
    	setSize(800, 600);
    
    	/*********************************************/
    
    	int qtdLoop = 2;
   	 	jpanelFixo = new JPanel();
 
      	jpanelFixo.add(btnselecionar, BorderLayout.SOUTH);
      	btnselecionar = new JButton("Marcar");
    	for (int x=0;x<jpanel.length;x++) {//2 GIROS
    		jpanel[x] = new JPanel(new FlowLayout(FlowLayout.LEFT, 11,20));
        	for (int i = 0; i < 3; i++) {
            	botões[x][i] = new JButton(new ImageIcon("img/java.png"));
            	jpanel.add(botões[x][i]);
            	//jpanel.add(new JButton(new ImageIcon("img/java.png")));
        	}
        	jpanelFixo.add(jpanel[x]);
    	}//FIM DO LAÇO
      
      	btnselecionar.addActionListener(new ActionListener(){
          public void actionPerformed(ActionEvent evt) {
            btnselecionar.setEnabled(false);
            for (int i = 0; i < 2; i++) {
              for(int j = 0; j < 3; j++) {
                botões[i][j].setEnabled(false);
              }
            }
          }
        });
      
    	add(jpanelFixo, BorderLayout.CENTER);
    }
}

Desse jeito fica todo dinâmico e funciona do jeito que você preparou com as iterações.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

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 ideia? 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++) {//2 GIROS
            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 atenção prestada!

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...