Trocar de imagem de um imageLabel em um Jpanel!

9 respostas
tiagooot

Estou com um problema, espero que possam me ajudar !!!

Estou fazendo um jogo de dados, e fiz um JPanel com 5 imagens de dados !!!

Eu gostaria que quando sortea-se o dado aparecesse a imagem do dado sorteado !!!

Estou fazendo da seguinte forma mas nao da certo …

<blockquote> if (dado1==1)

{

imageLabel1.setIcon(new javax.swing.ImageIcon(getClass().getResource(“C:/Users/usuario/Desktop/Bozo2 - epn drive/src/bozo/imagem/d1.JPG”)));

imageLabel1.setName(“imageLabel1”);

}

if (dado1==2)

{

imageLabel1.setIcon(new javax.swing.ImageIcon(getClass().getResource(“C:/Users/usuario/Desktop/Bozo2 - epn drive/src/bozo/imagem/d2.JPG”)));

imageLabel1.setName(“imageLabel1”);

}</blockquote>

Estou usando 5 imageLabel …

Se alguem pudesse me ajuda eu agradeceria !!!

OBS: quando inicio o programa ja é carregada a imagem de um dado !!!

Gostaria de fazer a troca de imagens para o dado que foi sorteado !!!

Espero que ajudem-me !!!

Obrigado !!

9 Respostas

Rummenigge

É melhor você carregar todas as imagens no começo do seu programa e inseri-la em um vetor de ImageIcon[].

Ai quando o dado for sorteado, é só dar um setIcon() no label com com indice escolhido.

imageLabel1.setIcon(vetorDeImagens[numeroSorteado]);
imageLabel1.setName("Image label " + i + 1)

É melhor do que fazer seis condções e recarregar a imagem toda vez que o dado for sorteado.

sandro.ci02

Abaixo um codigo antigo meu, acho que pode ajudar.

package imagens;

import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.WindowConstants;

public class Running extends javax.swing.JPanel implements ActionListener{
	private static final long serialVersionUID = 1L;
	private JLabel jLabelStatusA;
	private JLabel jLabelA;
	private JButton jButtonRun;

	public static void main(String[] args) {
		JFrame frame = new JFrame();
		frame.getContentPane().add(new Running());
		frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
		frame.pack();
		frame.setVisible(true);
	}
	
	public Running() {
		super();
		initGUI();
	}
	
	private void initGUI() {
		try {
			setPreferredSize(new Dimension(400, 300));
			this.setLayout(null);
			{
				jLabelStatusA = new JLabel();
				this.add(jLabelStatusA);
				jLabelStatusA.setBounds(89, 4, 64, 61);
				jLabelStatusA.setIcon(new ImageIcon(getClass().getClassLoader().getResource("images/ok.png")));
			}
			{
				jLabelA = new JLabel();
				this.add(jLabelA);
				jLabelA.setText("A");
				jLabelA.setBounds(45, 18, 27, 27);
				jLabelA.setFont(new java.awt.Font("Verdana",0,20));
			}
			{
				jButtonRun = new JButton();
				this.add(jButtonRun);
				jButtonRun.setText("Runing");
				jButtonRun.setBounds(32, 86, 83, 50);
				jButtonRun.addActionListener(this);
			}

		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public void actionPerformed(ActionEvent arg0) {
        new Thread() {
            public void run() {
                try {
                	for (int i = 0; i < 5; i++) {
                		exibirFigura(i);
                		Thread.sleep(1000);
					}
                } catch (Exception e) {
              
                    e.printStackTrace();
                }
            }

			private void exibirFigura(int i) {
				jLabelStatusA.setIcon(new ImageIcon(getClass().getClassLoader().getResource("images/"+i+".png")));
				repaint();
			}
        }.start();
	}
}
tiagooot

Rummenigge:
É melhor você carregar todas as imagens no começo do seu programa e inseri-la em um vetor de ImageIcon[].

Ai quando o dado for sorteado, é só dar um setIcon() no label com com indice escolhido.

imageLabel1.setIcon(vetorDeImagens[numeroSorteado]);
imageLabel1.setName("Image label " + i)

É melhor do que fazer seis condções e recarregar a imagem toda vez que o dado for sorteado.

Como farei esse vetor ?? tipow, como carregar as imagens nele !

Se puder especificar mais eu agradeceria, Obrigado !!!

Rummenigge

Ficaria assim :

public class SuaClasse {

    ImageIcon[] icones;

    public SuaClasse() {
        icones = new ImageIcon[6];
        carregaImagens();
    }
    
    private void carregaImagens() {
        icones[0] = new ImageIcon("Imagem do dado com o lado 1");
        icones[1] = new ImageIcon("Imagem do dado com o lado 2");
        icones[2] = new ImageIcon("Imagem do dado com o lado 3");
        icones[3] = new ImageIcon("Imagem do dado com o lado 4");
        icones[4] = new ImageIcon("Imagem do dado com o lado 5");
        icones[5] = new ImageIcon("Imagem do dado com o lado 6");
    }
}

Um pequeno exemplo de como funcionaria :

private metodoTrocaImagem() {
/*Sorteará um número de 0 a 5 referente às posições do dado*/
    int sorteio = (int) Math.round(Math.random() * 6);
    labelDado.setIcon(icones[sorteio]);
}
tiagooot

ok… era do jeito que estava fazendo…
porém os imageLabel o NetBeans criou em uma outra classe !
está assim meu programa…

Isso é uma pequena parte…

Agora as inicializações dos imageLabel e tal´s entao em uma função

<blockquote>private void initComponents()

{

}</blockquote>

e nao consigo usar os ImageLabel.setIcon por causa dos imageLabel

como faço pra utilizar eles na função public void botao();

Rummenigge

Eu não consegui entender o que você disse aqui

Essa função public void botao() seria invocada quando? Após um botão ser clicado?
Por que se for você vai ter que invocá-la dentro de actionPerformed(ActionEvent e) de ActionListener().

Explique um pouco mais.

tiagooot

sim o private void botao() é um action ...

esta assim a função !!!

private void btnRodarDadosActionPerformed(java.awt.event.ActionEvent evt) {                                              
        Random valor = new Random();

       
        ImageIcon[] icones=null;
        icones = new ImageIcon[6];

        icones[0] = new ImageIcon("C:/Users/usuario/Desktop/Bozo/src/bozo/imagem/d1.JPG");
        icones[1] = new ImageIcon("C:/Users/usuario/Desktop/Bozo/src/bozo/imagem/d2.JPG");
        icones[2] = new ImageIcon("C:/Users/usuario/Desktop/Bozo/src/bozo/imagem/d3.JPG");
        icones[3] = new ImageIcon("C:/Users/usuario/Desktop/Bozo/src/bozo/imagem/d4.JPG");
        icones[4] = new ImageIcon("C:/Users/usuario/Desktop/Bozo/src/bozo/imagem/d5.JPG");
        icones[5] = new ImageIcon("C:/Users/usuario/Desktop/Bozo/src/bozo/imagem/d6.JPG");


        if (jogadas < 3) {
            cbD1.setEnabled(true);
            cbD2.setEnabled(true);
            cbD3.setEnabled(true);
            cbD4.setEnabled(true);
            cbD5.setEnabled(true);



            //btnRodarDados.setText("Rodar Dados");
            if (!cbD1.isSelected()) {
                dado1 = valor.nextInt(6) + 1;
                imageLabel1.setIcon(icones[dado1-1]);
                cbD1.setText(Integer.toString(dado1));
            }
            if (!cbD2.isSelected()) {
                dado2 = valor.nextInt(6) + 1;
                cbD2.setText(Integer.toString(dado2));
                imageLabel2.setIcon(icones[dado2-1]);
            }
            if (!cbD3.isSelected()) {
                dado3 = valor.nextInt(6) + 1;
                imageLabel3.setIcon(icones[dado3-1]);
                cbD3.setText(Integer.toString(dado3));
            }
            if (!cbD4.isSelected()) {
                dado4 = valor.nextInt(6) + 1;
                imageLabel4.setIcon(icones[dado4-1]);
                cbD4.setText(Integer.toString(dado4));
            }
            if (!cbD5.isSelected()) {
                dado5 = valor.nextInt(6) + 1;
                imageLabel5.setIcon(icones[dado5-1]);
                cbD5.setText(Integer.toString(dado5));
            }

            jogadas++;

            System.out.println("Jogadas: " + jogadas);
            txJogada.setText("Jogadas restantes: " + (3 - jogadas));

        }
o problema é o o imageLabel1 , imageLabel2 , imageLabel3 , imageLabel4 e imageLabel5 foram criado na função:
private void initComponents()
{
...
}

e quando tento usar eles na private void btnRodarDadosActionPerformed(java.awt.event.ActionEvent evt) aparece no NetBeans Cannot Find symbol ...

Antes eu estava declarando dentro da função do botao, mas ae nao trocava...
O que preciso fazer para conseguir usar os ImageLables e consequentemente fazer a troca das imagens !!!

Obrigadoo

Rummenigge
public class SuaClasse implements ActionListener {
//Se você declarar os campos(variáveis) no topo da classe, elas serão vistas em todo o programa, evitando o \"Cannot find symbol\"
    JLabel  imageLabel1,  imageLabel2,  imageLabel3,  imageLabel4,  imageLabel5, imageLabel6;
    ImageIcon[] icones;
/*Como eu falei, os images icones têm que serem carregados logo no começo, se toda vez que alguém clicar no botão e 
todos eles forem instanciados, pode ocorrer algum atraso nas reconstruções das imagens. 
*/
//Construtor da classe
    public SuaClasse() {
        carregaImagens();
        initComponents();
    }
}

public void carregaImagens() {
     icones = new  ImageIcon[6];  
     icones[0] = new ImageIcon("C:/Users/usuario/Desktop/Bozo/src/bozo/imagem/d1.JPG");  
     icones[1] = new ImageIcon("C:/Users/usuario/Desktop/Bozo/src/bozo/imagem/d2.JPG");  
     icones[2] = new ImageIcon("C:/Users/usuario/Desktop/Bozo/src/bozo/imagem/d3.JPG");  
     icones[3] = new ImageIcon("C:/Users/usuario/Desktop/Bozo/src/bozo/imagem/d4.JPG");  
     icones[4] = new ImageIcon("C:/Users/usuario/Desktop/Bozo/src/bozo/imagem/d5.JPG");  
     icones[5] = new ImageIcon("C:/Users/usuario/Desktop/Bozo/src/bozo/imagem/d6.JPG");  
}

public void initComponents() {
    ....
}
/*Agora você pode ter acesso às variáveis ImageLabel's toda vez que o botão for apertado*/
   1. private void  btnRodarDadosActionPerformed(java.awt.event.ActionEvent evt) {                                                
   2.        Random valor = new Random();  
   3.   
  15.   
  16.        if (jogadas < 3) {  
  17.            cbD1.setEnabled(true);  
  18.            cbD2.setEnabled(true);  
  19.            cbD3.setEnabled(true);  
  20.            cbD4.setEnabled(true);  
  21.            cbD5.setEnabled(true);  
  22.   
  23.   
  24.   
  25.            //btnRodarDados.setText("Rodar Dados");  
  26.            if (!cbD1.isSelected()) {  
  27.                dado1 = valor.nextInt(6) + 1;  
  28.                imageLabel1.setIcon(icones[dado1-1]);  
  29.                cbD1.setText(Integer.toString(dado1));  
  30.            }  
  31.            if (!cbD2.isSelected()) {  
  32.                dado2 = valor.nextInt(6) + 1;  
  33.                cbD2.setText(Integer.toString(dado2));  
  34.                imageLabel2.setIcon(icones[dado2-1]);  
  35.            }  
  36.            if (!cbD3.isSelected()) {  
  37.                dado3 = valor.nextInt(6) + 1;  
  38.                imageLabel3.setIcon(icones[dado3-1]);  
  39.                cbD3.setText(Integer.toString(dado3));  
  40.            }  
  41.            if (!cbD4.isSelected()) {  
  42.                dado4 = valor.nextInt(6) + 1;  
  43.                imageLabel4.setIcon(icones[dado4-1]);  
  44.                cbD4.setText(Integer.toString(dado4));  
  45.            }  
  46.            if (!cbD5.isSelected()) {  
  47.                dado5 = valor.nextInt(6) + 1;  
  48.                imageLabel5.setIcon(icones[dado5-1]);  
  49.                cbD5.setText(Integer.toString(dado5));  
  50.            }  
  51.   
  52.            jogadas++;  
  53.   
  54.            System.out.println("Jogadas: " + jogadas);  
  55.            txJogada.setText("Jogadas restantes: " + (3 - jogadas));  
  56.       }
  57.   }

Espero que ajude
Uma dica : Evite utilizar o NetBeans para geração de código automática, estude como estruturar bem um código, pelo menos evitará que você se enrole com problemas simples nos próximos
programas.

VLW!

tiagooot

blz amigo…
consegui aqui… deu td certo , valeu pela ajuda…

mto bomm !!!

valeuuu

Criado 9 de dezembro de 2010
Ultima resposta 16 de dez. de 2010
Respostas 9
Participantes 3