Pegar imagem JFileChooser e exibir JPanel [RESOLVIDO]

Olá, sou novo por aqui, e também em programação Java.
Preciso da ajuda de voces, estou utilizando um jfilechooser para pegar uma imagem, após isso preciso coloca-la como icone de um Jlabel (foto) dentro de um jpanel.
Segue abaixo o codigo, não sei se postei da maneira correta.
espero que alguem possa me ajudar.


import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JColorChooser;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.filechooser.FileNameExtensionFilter;

public class Desafio extends JFrame {

    private JPanel Jp = new JPanel();
    private JLabel Jl1 = new JLabel("Foto");
    private JLabel Jl2 = new JLabel();
    private JLabel Jl3 = new JLabel();
    private JButton Jb1 = new JButton();
    private JButton Jb2 = new JButton();
    private ImageIcon icone = new ImageIcon();

    public Desafio() {
        criaJFrame();
        criaJButton();
        criaJLabel();
        criaJLabel();
    }

    public void Icones() {
        setSize(200, 200);
        setVisible(true);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setTitle("Imagem para o Panel");

    }

    public void criaJFrame() {
        setVisible(true);
        setSize(350, 500);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        getContentPane().setLayout(new FlowLayout());
        Jp.setPreferredSize(new Dimension(300, 250));
        Jp.setBorder(BorderFactory.createEtchedBorder());
        getContentPane().add(Jp);
    }

    public void criaJButton() {
        Jb1.setVisible(true);
        Jb2.setVisible(true);
        Jb1.setSize(130, 25);
        Jb2.setSize(130, 25);
        Jb1.setText("Cor");
        Jb2.setText("Foto");
        getContentPane().add(Jb1);
        getContentPane().add(Jb2);

        Jb2.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                JFileChooser jfc = new JFileChooser();
                jfc.setFileFilter(new FileNameExtensionFilter("Imagem", "jpg", "jpeg", "gif"));
                jfc.setFileSelectionMode(JFileChooser.FILES_ONLY);
                jfc.showDialog(jfc, "Selecione");
                JOptionPane.showMessageDialog(null, jfc.getSelectedFile());
            }
        });

        Jb1.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                JColorChooser jcc = new JColorChooser();
                Color c = jcc.showDialog(Jp, "Seleção de Cores", Color.yellow);
                Jp.setBackground(c);

            }
        });

    }

    public void criaJLabel() {
        Jl1.setVisible(true);
        Jl2.setVisible(true);
        Jl3.setVisible(true);
        Jl1.setSize(80, 20);
        Jl2.setSize(80, 20);
        Jl3.setSize(80, 20);
        Jl1.setLocation(300, 300);
        Jl2.setLocation(400, 300);
        Jl3.setLocation(450, 300);
        Jl1.setText("Foto");
        Jl2.setText("Nome");
        Jl3.setText("Sel.Foto");
        Jp.add(Jl1);
        getContentPane().add(Jl2);
        getContentPane().add(Jl3);

    }

    public static void main(String[] args) {
        new Desafio();
    }
}

Bom, você está no caminho certo. Só dois detalhes:

  1. Faltou a extensão PNG também. :slight_smile:
  2. O usuário ainda pode escolher se ele quer o filtro que você criou ou se quer o filtro “All files” (o que não deveria acontecer). Pesquise sobre o método setAcceptAllFileFilterUsed(boolean b) da classe JFileChooser.

Quanto à leitura de imagens, se você já tem o arquivo que o usuário escolheu (e sim, você já tem!), procure sobre a classe ImageIcon. Você pode criar um novo objeto desse tipo e passar como argumento para o método setIcon() da classe JLabel. Isso significa que será mais fácil se você adicionar um JLabel dentro do JPanel quanto houver imagem e removê-lo quando for cor.

Marco, obrigado pela ajuda.
Adicionei os dois detalher que vc me atentou e ficou beleze.
Não entendi a parte do Imageicon, eu devo criar um novo método como
public void ImageIcon(){
Objecto ImageIcon img = new Imageicon();
}
Seria isso? ou não?
obrigado

É o seguinte:

No método, onde você vai alterar a imagem faça o seguinte:

  1. Pegue o caminho da imagem que o usuário escolheu (método getAbsolutePath()).
  2. Crie um novo objeto ImageIcon, passando o caminho que você pegou como argumento.
  3. Volte a cor do painel para o original (setBackground(null)).
  4. Use o método setIcon() do objeto Jl1, passando o ImageIcon criado como argumento.
    Algo assim:
String caminho = jfc.getSelectedFile().getAbsolutePath();
ImageIcon icon = new ImageIcon(caminho);
Jp.setBackground(null);
Jl1.setIcon(icon);

Na parte onde você muda a cor, chame o método setIcon() de JLabel, passando ‘null’ para que a imagem suma:

Jl1.setIcon(null);
Jp.setBackground(c);

Acho que isso resolve.

Deu certo aggora marco, agora consegui entender.
fcou fino demais, agora se o cara selecionar uma cor e depois selecionar a foto, ele limpa a cor.
Muito obrigado pela força, entendi direitinho.
Abraços e valew

[quote=viniciuslaredo]Deu certo aggora marco, agora consegui entender.
fcou fino demais, agora se o cara selecionar uma cor e depois selecionar a foto, ele limpa a cor.
Muito obrigado pela força, entendi direitinho.
Abraços e valew[/quote]

Boa. Se tudo está certo, coloque [RESOLVIDO] no título do tópico, e até a próxima!

belza cara, Obrigado mais uma vez.

[RESOLVIDO]