Jpanel x Jlabel para carregar imagens de um Banco de Dados [Aguardando Confirmação p/ Resp.]

15 respostas
E

Boa noite Pessoal, so novo aki no forum e novo tbm em app. c/ Swing + NetBeans …

To fazenu um cadastro q carrega várias imagens de um Banco de Dados porém vi na net q tem N jeito , os + comuns são
através do repaint() do JPanel inserindo um ImageIcon nele e o JLabel.setIcon .

Alguém por favor sabe me dizer o PQ e QUAL dos 2 é mais eficaz PARA APENAS CARREGAR AS IMAGENS + rápido.

Qm puder me ajudar Agradecido !!!
Abs !

15 Respostas

erico_kl

eu fiz um componente que herda de JLabel e tem algumas operações que facilitam a manutenção da foto quando gravada como tipo bytea no banco. Se o seu caso for esse posso te passar o componente… se for só carregar a imagem sem precisar salvar ela no banco use o JLabel mesmo…

E

Boa noite Erico_KL , se puder passar agradeço cara , sobre a minha dúvida sobre qual era a mais rápida eu num achei tbm a resposta , PORÉM achei meia resposta , q é add. num JLabel pelo menos pra implementar é mais rápido do que fazendo draw com JPanel´s …

No caso do JLabel eu fiz assim , sera q no draw seria melhor ? ou + rápido ?

javax.swing.ImageIcon img[];
             String ends[];
                ....

             try{

                for(int i=1;i<=8;i++)
                {

                       //Pega endereço da foto e poe no ImageIcon  , pega do bda endfs[i] = "C://fotos//ft1.jpg"
                        img[i] = new javax.swing.ImageIcon(endfs[i]);

                        //verifica c foto a altura da foto é ==-1 , se for ela num ecxiste
                        if(img[i].getIconHeight()==-1)
                        {
                             //pega uma foto padrão p/ erro caso nao ache foto , o caminho é uma pasta q esta com os .class 
                              img[i]= new javax.swing.ImageIcon(getClass().getResource("resources//ERROR.jpg")) ;
                        }
                        else // c entrou aki a foto existe
                        {
                               // pega a foto d tamanho variavel e redimenciona em 170,170 q é o tam do JLabel aki
                      
                              img[i]=
                           new javax.swing.ImageIcon(
                             new javax.swing.ImageIcon(
                                                 endfs[i]).getImage().getScaledInstance(170, 170, Image.SCALE_DEFAULT)
                             ) ;
                            
                               }
                          }
               
                         // ponho a foto no JLabel
                        this.lblfoto1.setIcon(img[1]); 
                    ...........
                     }cath(...........

Vlw por ajudar na dúvida.

erico_kl

cara… coloca as tags {code} e {/code} antes e depois do teu código, respecitvamente (troque as chaves por colchetes)… fica melhor para ler

E

Vlw eu tava querenu saber isso tbm…qdo c puder deixa o codigo q c falow por gentileza !
Abs !

erico_kl

Segue aí 2 classes que eu criei que contém métodos pra manutenção de imagens. Uma delas é o componente que estende de JLabel e a outra é uma classe com vários métodos que auxiliam no tratamento de imagens, tais como conversões para byte[], redimensionamento da imagem, exportação em GIF, JPEG, PNG e BMP etc…
Claro… estas classes estão implementadas de acordo com as minhas necessidades. Você terá que adaptá-las.

ViniGodoy

também fiz uma classe de ImagePanel. Suporta redimensionamento, imagens lado-a-lado ou centralizada (como no caso do papel de parede do Windows):
http://www.guj.com.br/posts/list/56248.java

erico, cuidado que você deve copiar o contexto gráfico antes de alterar as propriedades dele:

Graphics2D g2d = (Graphics2D) graphics.create(); //Pintura ou impressão aqui g2d.dispose();

Principalmente pq vc altera background e outras propriedades que o java pode esperar que não estejam alteradas, em métodos futuros (já tive casos de comportamentos bizarros ao esquecer disso).

erico_kl

isso sempre antes de trabalhar com Graphics2D?

M

Sempre que for fazer alterações no gráfico, sim (mudar o background, o paint, rotate, e assim por diante).

E interessante, o ImagePanel estende JLabel…

erico_kl

Sempre que for fazer alterações no gráfico, sim (mudar o background, o paint, rotate, e assim por diante).

E interessante, o ImagePanel estende JLabel…
mas tem algum problema em estender JLabel?

ViniGodoy

Nenhum problema. Mas se não for usar o resto dos atributos do JLabel (como o texto dela), talvez seja melhor só estender de JComponent, que nem sequer tem essa propriedade.

erico_kl

ah… é que eu estendi JLabel por causa do set/getIcon

erico_kl

e o método print ficou assim então:

public void print(java.awt.Graphics g) {
	super.print(g);
	Graphics2D g2d = (Graphics2D) g.create();   
	g2d.setBackground(Color.WHITE);
	g2d.setColor(Color.BLACK);
	g2d.drawRoundRect(0, 0, this.getWidth(), this.getHeight(), 5, 5);
	g2d.drawLine(2, 2, this.getWidth() - 2, this.getHeight() - 2);
	g2d.drawLine(2, this.getHeight() - 2, this.getWidth() - 2, 2);
	g2d.dispose();
}
E

Oi pessoal , tbm pesquisando mais sobre o assunto vi que grande maioria ou quase todas as aplicações que usam imagens, figuras e fotos, usam o Jpanel implementando o Draw , LOGO A RESPOSTA DO TÓPICO : Jpanel x JLabel p/ carregar imagens de um Banco de Dados : JPANEL IMPLEMENTANDO O DRAW , C eu estiver errado por favor me corrigam !!!

Obrigado pelas Classes Pessoal !!!
Vlw !!!

erico_kl

acho que não existe uma regra: “Faça com JLabel” ou “Faça com JPanel”… depende de cada situação… pra mim sempre serviu o JLabel…

ViniGodoy

É porque, em muitos casos, a pessoa quer colocar componentes em cima da imagem, como no caso de um papel de parede. Como o painel é também um container, torna-se ideal utiliza-lo.

Se você for fazer um componente pura e simplesmente para exibir a imagem, sem componentes em cima, eu sobrescreveria o JComponent.
Para um painel com imagem de fundo, o JPanel.

Mas também não existe uma graaande diferença, caso você use o JLabel.

Criado 4 de fevereiro de 2010
Ultima resposta 8 de fev. de 2010
Respostas 15
Participantes 4