Trazer imagem do banco de dados e setando no label

Boa Noite galera.
Estava pesquisando e não achei nada do meu problema.
Seguinte. Consegui salvar um imagem no banco, porem não consegui trazer ela de volta ao label.
Li que não e legal, gravar imagem no banco, porem não achei algo para me ajudar a referenciar imagem no produto.
Alguém pode me ajudar?
Então ficou assim. gravo um produto, quando clico nele os dados volta incluindo as fotos.

Vlw

Beleza, você quer trazer ela do banco mesmo ou quer uma alternativa?

Bom dia.
Aceito sugestão…

Bom dia!
E aí @Vicente_Bertipalha_B, tudo bem?

Então, outra alternativa seria guardar suas imagens em uma pasta, e no banco de dados você guarda apenas o nome com formato da imagem, também seria legal armazenar a data.

Algumas observações:
1° - Sua consulta ficará mais rápida.
2° - Você guardará suas imagens separadas por ano e mês. ( Por exemplo: Uma pasta para o ano 2018, e uma para cada mês.) fazendo assim fica mais fácil encontrar suas imagens, pois você filtrará pelo nome e pela data. (Pelo menos uma pasta para o ano seria interessante, principalmente a fim de organização).
3° - Para você não enfrentar o problema de nomes repetidos, você pode criar uma função que retorna uma hash do nome da imagem e da dada atual, por exemplo: hash("nome_fig + 2019-06-17 08:30:27.000031").jpg e essa hash será o novo nome da imagem.

Um bom caminho seria ter identificador único (id) para cada produto, assim, você poder usar o id do produto como chave estrangeira na imagem, na hora de armazenar no DB, depois fica fácil de recuperar.

Creio que com esses passos seu problema se resolve.

Abraços!

2 curtidas

Oi Tuna, vou tentar fazer aqui, o problema é que estou aprendendo a mexer nestas aplicações sozinho, então quando o assunto e meio teórico ou técnico eu apanho um pouco, mais vou tentar fazer aqui, qualquer coisa vou vir aqui pedir ajuda de novo.
Olha no casso da pasta ano/mês, creio que não seria necessário, pois no meu banco é para produtos, então cada produto teria um id. certo ?

1 curtida

Sem problemas, qualquer coisa estamos aí. Depois, relaxa é assim mesmo, fazendo na raça é bom a gente aprende e dificilmente esquece!

Correto, se cada produto é único, então, é justo cada um ter um id, mas não esqueça de usar o id do produto como chave estrangeira da imagem, a chave estrangeira é de suma importância para recuperar a(s) imagem(ns) referente ao produto em questão.

Tem um software chamado Navicat, ele é muito bom, ele faz o trabalho com bando de dados render e muito, facilita nossa vida; ele é pago, mas há uma versão de teste (trial), creio eu que possa te ajudar a modelar a estrutura do teu db, tem vários tutoriais no YouTube de como usa-lo, segue o link do mesmo: Navicat GUI | Ferramenta de Gestão de Banco de Dados para MySQL, MariaDB, SQL Server, SQLite, Oracle e PostgreSQL..

Você consegue :tada: .

Abraços!

1 curtida

EDIT: Da uma olhada no poste abaixo, não se preocupa muito com os códigos, mas sim com a raiz do problema, ele é um tanto parecido com o teu, acho que pode te ajudar na solução e modelagem do teu db.

link: Banco de Dados

Abraços!

Tuna da uma olha só… ve se pode me ajudar.

Este código fiz para chamar a imagem.

JFileChooser fc = new JFileChooser();
        int res = fc.showOpenDialog(null);

        if (res == JFileChooser.APPROVE_OPTION) {
            File arquivo = fc.getSelectedFile();

            try {
                imagem = ManipularImagem.setImagemDimensao(arquivo.getAbsolutePath(), 160, 160);

                lblImagem.setIcon(new ImageIcon(imagem));

            } catch (Exception ex) {
                // System.out.println(ex.printStackTrace().toString());
            }

        } else {
            JOptionPane.showMessageDialog(null, "Voce nao selecionou nenhum arquivo.");
        }

Agora para salva a imagem.

//salvar imagem na pasta
            String caminho = getClass().getResource("../imagens/").toString().substring(5);
            String nomedafoto = modelProduto.getNome();
            File outputfile = new File(caminho + nomedafoto + ".jpg");
            ImageIO.write(imagem, ".jpg", outputfile);

2 Pergunta.

1 Como faço para salvar o caminho no banco.
2 Depois como faço para trazer setar o caminho no Label.

Desde já agradeço.

Assiste essa aula, ele te dará uma noção básica sobre inserção de imagens e você organiza na sua condição.

1 curtida

Boa tarde @Vicente_Bertipalha_B, tudo bem?!

Vamos por parte, vamos criar uma boa lógica para o bom funcionamento do seu software, veja!
1° - Acho que podemos facilitar nossa vida salvando apenas o nome da imagem no banco de dados e sua extensão;
2° - Se fizermos isso, não vamos nos preocupar com o caminho das imagens, ela ficarão em uma única pasta, e poderemos recuperar tudo dinamicamente;
3° - Vamos adotar a seguinte estrutura para seu projeto:

  Folder
____|_____
|        |
|        |__ imagens (Aqui vão todas as suas imagens)
|
|__ src (E aqui vão todos os principais arquivos do seu projeto)


#DEPOIS DE CONSTRUIR SEU .jar TEREMOS A SEGUINTE ESTRUTURA:
  Folder
____|_____
|        |
|        |__ imagens
|_ Seu programa.jar

Observe que que adotando essa estrutura fica muito mais fácil, pois onde estiver seu arquivo.jar, as imagens estão logo ao lado dentro da pasta imagens.


Agora vamos definir uma boa lógica para o seu banco de dados.
Basicamente, teu banco de dados tem (ou pelo menos deve ter) a estrutura abaixo.
modelo
Repare que a tabela imagens tem uma coluna produto_id, esse atributo recebe o id de um produto, ou seja, eu estou amarrando uma imagem a um produto especifico. E isso me ajudara muito, pois me possibilita recuperar uma imagem pelo id do produto.


Vamos salvar apenas o nome do imagem com sua extensão. Para você inserir no bando de dados o nome da imagem você vai precisar do id do produto.
Ex: imagine que o produtor calculara tenha o id = 8.

INSERT INTO tabela_imagens (produto_id, imagem_name) VALUES ( 8, "calculadora.jpg");

Por agora, vamos nos preocupar em cadastrar os produtos e os nomes da imagens no banco de dados, relaxa que eu já tenho uma função já pronta que muda a imagem do label dinamicamente (fiz hoje), assim que terminares essa parte primeira parte eu mando e te explico como usa-la, é bem simples.


Não esquece de organizar teu projeto da maneira que especificamos logo acima, na verdade acho que tu já estás até fazendo isso. O código abaixo usa recupera o caminho da pasta imagens dinamicamente, usa ele.

String caminho = System.getProperty("user.dir")+"\\imagens\\";    
    

Vou te mandar um exemplo compilado, em que recupero tudo dinamicamente, faz uns testes com ele, e não se preocupa em setar o label ainda, vamos nos atentar na estrutura e lógica do teu software, setar as imagens no label é detalhe, segue o exemplo: exemplo.zip (286,3 KB)

Qualquer coisa estamos aí!

Abraços!

Quanto aos teus códigos, meus parabéns :tada:
Está ficando legal sua lógica. Pelo que vi, Você vai cadastrar os produtos no banco de dados (junto com o nome das imagens), por fim, irás salvar as imagens na pasta imagens.

Está muito bom!

Sim, obrigado, como estou aprendendo sozinho, vou filtrando e mesclando alguns videos no youtube e alguns fóruns então estou fazendo este projeto para aprendizados. .
Mais não é fácil, pois nós ( pessoal leiga no assunto) precisamos de pessoas com você e o Abner, são de grande valia.

Você está indo bem :handshake:
O que mais vemos hoje são pessoas pedido códigos prontos, mas você está fazendo na raça.

Dá uma olhada nestas duas playlists abaixo:
Interface Gráfica JavaSE com NetBeans
Interface Gráfica Java com Banco de Dados MySQL

1 curtida

Obrigado pela ajuda vou assistir estes videos

1 curtida

Grande @Vicente_Bertipalha_B!

import java.io.File;
import javax.swing.ImageIcon;
import javax.swing.JLabel;

/**
 *
 * @version 0000.00.00
 */
public class ImageLabel {

    /**
     * <h2>Método permite "setar" imagem em um JLabel</h2>
     * <p>Este método permite que o usuario trabalhe com imagens que estao fora da 
     * construcao (.jar), em outras palavras, imagens que estao fora do source (src),
     * e assim possibilitando usuario setar imagens no jlabel mesmo depois da contrucao do projeto.</p>
     * 
     * <p>PARA O USO DESTE METODO A PASTA COM AS IMAGENS DEVE OBRIGATORIAMENTE 
     * SER IRMA DO ARQUIVO (.jar), OU SEJA, DEVEM ESTA NOM MESMO DIRETORIO.
     * 
     * <br /> Mother Folder. <br /> 
     * |__ imagens<br />
     * |__ programa.jar<br />
     * </p>     
     *
     * @param label  JLabel label que deve ser settado.
     * @param folder String folder, nome da pasta onde se encontra(m) a(s) imagem(ns).
     * @param image  String image, nome e extensao da imagem que sera "setada" no label.
     */
    public void setImageLabel(JLabel label, String folder, String image) {
        String path = System.getProperty("user.dir") + "\\" + folder + "\\";
        File file = new File(path + image);
        if (file.exists()) {
            label.setIcon(new ImageIcon(path + image));
        } else {
            System.err.println("That file doesn't exist.");
        }
    }

    /**
     * <h2>Método permite "setar" imagem em um JLabel</h2>
     * <p>Este método permite que o usuario trabalhe com imagens que estao fora da 
     * construção (.jar), em outras palavras, imagens que estão fora do source (src),
     * e assim possibilitando usuario setar imagens no jlabel, não importa onde as 
     * imagens estejam mesmo depois da contrução do projeto.</p>
     * 
     * @param label JLabel label que deve ser settado.
     * @param path  String path, caminho completo desde a raiz.
     * @param image String image, nome e extensão da imagem que será "setada" no label.
     */
    public void setImageLabelWherever(JLabel label, String path, String image) {
        File file = new File(path + image);
        if (file.exists()) {
            label.setIcon(new ImageIcon(path + image));
        } else {
            System.err.println("That file doesn't exist.");
        }
    }
    
}

Abraços!

Oba @Tuna muito obrigado… pela ajuda…

conseguiu terminar?