JImagePanel - Funciona uma única vez. PQ? [Resolvido]

48 respostas
peerless

Tenho uma classe que peguei aqui no site, senão me engano do vinygodoy… JImagePanel,
ela funciona beleza. Só que estou com problemas ao alterar a imagem… ela funciona só na primeira alteração, e não faço idéia pq não funciona na segunda… (quando tento utilizar o método setImg novamente)

Código:

private void setImg(String foto) { try { JPi = new JImagePanel(foto); } catch (Exception ex) { sst("Erro: "+ex); } JPi.setBounds(5,15,196,320); JPimg.add(JPi); JPimg.repaint(); }

abraços!

48 Respostas

ViniGodoy

Não tem como você alterar a imagem. Que eu me lembre, fiz a classe para ser imutável.

Você deve criar um novo JImagePanel, ou altera-la para ser mutável.

peerless

Uma dica :(

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JPanel;

/**
 * A panel that contains a background image. 
 * The background image is automatically sized to fit in the panel.
 */
public class JImagePanel extends JPanel
{
    BufferedImage background = null;
    
    /** Creates a new panel with the given background image.
      * @param img The background image. */
    public JImagePanel(BufferedImage img)
    {
        if (img == null)
            throw new NullPointerException("Buffered image cannot be null!");
        this.background = img;
    }

    /** Creates a new panel with the given background image.
      * @param img The background image. 
      * @throws IOException, if the image file is not found.
      */
    public JImagePanel(File imgSrc) throws IOException
    {
        this(ImageIO.read(imgSrc));
    }

    /** Creates a new panel with the given background image.
      * @param img The background image. 
      * @throws IOException, if the image file is not found.
      */
    public JImagePanel(String fileName) throws IOException
    {
        this(new File(fileName));
    }
    

    protected void paintComponent(Graphics g)
    {        
	super.paintComponent(g);
        Graphics2D g2d = (Graphics2D)g.create();
        g2d.drawImage(background, 0, 0, this.getWidth(), this.getHeight(), null);
        g2d.dispose();        
    }    
}
ViniGodoy

A classe JImagePanel, do projeto Towel, permite que você altere como a imagem deve ser pintada em relação ao painel (centralizado, lado-a-lado ou redimensionada). E permite que você use esse painel como imagem de fundo: http://code.google.com/p/towel/

peerless

Bom, eu consegui de uma forma…

Removi do painel a instancia da imagem, e re-adicionei.

JPimg.remove(JPi); this.setImg("/root/Desktop/Fotos/mico-bb.jpg");

ai funcionou,
mas se tiver mais idéias… serão bem vindas!

abração!

peerless

ViniGodoy:
Essa aqui é um ImagePanel mutável.

Obrigadão vini! :oops:

ViniGodoy

Oi, aproveitei a deixa e inclui mais um recurso no JImagePanel.
Já uma olhada, editei o post ali em cima e deixei o novo arquivo.

peerless

Poxa bacana,
mas o que eu posso fazer com este filltype ?
(desculpe a ignorancia)

ViniGodoy

Imagine que o panel é o desktop do Windows.

Se você põe uma imagem menor que o panel, e escolhe o fill type SIDE_BY_SIDE, a imagem vai ficar repetida diversas vezes. Se escolher CENTER, ela vai ficar no centro do painel, não será esticada. E resize é como antes, ela ficará do tamanho do Painel.

Lindberg

Valeu Vini !!!
vou testar

Como instanciar ?

JImagePanel jp = new JImagePanel.paintComponent(imagens/logo3.jpg);

//	jp = jp.paintComponent(“imagens/logo3.jpg”);

Desculpa Vini :lol: , sou iniciante …

Não consegui …

Preciso de ajuda, de alguem …

Valeu

Z

como faria para transformar isso num JavaBeans e usa-lo no NetBeans ?

Wolf_X

se eu nao me engano o paintComponent eh padrao e é chamado automaticamente assim como o metodo paint().

flaviotomazio

Como eu faço para adicionar ela ao meu projeto? Tipo, adicionar ela no formulário.

filiperangel

Como adicionar esse JImagePanel no jInternalFrame?

ViniGodoy

Igual vc adicionaria um painel qualquer.

DorPho

peerless:
Bom, eu consegui de uma forma…

Removi do painel a instancia da imagem, e re-adicionei.

JPimg.remove(JPi); this.setImg("/root/Desktop/Fotos/mico-bb.jpg");

ai funcionou,
mas se tiver mais idéias… serão bem vindas!

abração!

Pimg.removeAll();
this.setImg(“seucaminho”);

lepopps

Ola… tudo bem … Kara Sou Iniciante em Java … to usando o NetBeans 6.5 … vi essa classe JImagePanel … e é bem isso que eu estava procurando … mas não to conseguindo usa-la … tipo … como devo Instancia-la … ?? tipo sou bem leigo … desde ja agradeço … t+

ViniGodoy:
Imagine que o panel é o desktop do Windows.

Se você põe uma imagem menor que o panel, e escolhe o fill type SIDE_BY_SIDE, a imagem vai ficar repetida diversas vezes. Se escolher CENTER, ela vai ficar no centro do painel, não será esticada. E resize é como antes, ela ficará do tamanho do Painel.

DorPho
lepopps:
Ola.. tudo bem ... Kara Sou Iniciante em Java ... to usando o NetBeans 6.5 ... vi essa classe JImagePanel .... e é bem isso que eu estava procurando ... mas não to conseguindo usa-la .... tipo ... como devo Instancia-la .... ?? tipo sou bem leigo ..... desde ja agradeço .... t+
ViniGodoy:
Imagine que o panel é o desktop do Windows.

Se você põe uma imagem menor que o panel, e escolhe o fill type SIDE_BY_SIDE, a imagem vai ficar repetida diversas vezes. Se escolher CENTER, ela vai ficar no centro do painel, não será esticada. E resize é como antes, ela ficará do tamanho do Painel.

Eis o exemplo q o Vini postou algum tempo atrás (abaixo). Uma vez a classe JImagePanel criada, vc somente irá precisar de um Jframe com um JPanel para instancialá...

image = ImageIO.read(new File("caminhoDaImagem\imagem.jpg")); 
                                                          
        if (jPprincipal == null) jPprincipal = new JImagePanel(image);
            
        jPprincipal.setImage(image);
        seuJPanel.add(JPprincipal);
        seuJPanel.repaint();
        seuJPanel.validate();

pronto! com esse trecho de code vc consegue exibir seu arquivo/image, não se esqueça de criar uma variavel de instância do tipo JImagePanel...

private JImagePanel jPrincipal;

Um abraço!

D

galera estou fazendo uma palicação de processamento de imagens, preciso mostrar a imagem num jFrame qualquer, estou trabalhando com BufferedImage, alguem pode me esxplicar como faço pra exibir essa imagem com essa classe JImagePanel, ou se tem outra forma melhor?

DorPho

Seguinte…

Criando o seu objeto BufferImage, crie também um objeto para armazena-lo… (do tipo JImagePanel, esta classe deverá ser mantida no mesmo pacote do seu projeto)

private JImagePanel JPImage = null;
private BufferImage im = null;

OK…

Agora…

a única coisa que vc deverá fazer é instanciar um JPanel e add os objetos neste JPanel… desta forma:

JPanel jPanel = new JPanel();

im = ImageIO.read(new File(caminhoDaImagem));

if (JPimage == null) JPimage = new JPImage(im);
            
JPimage.setImage(image);
jPanel.add(JPimage);
jPanel.repaint();
jPanel.validate();

Se tiver alguma dúvida, me envie uma MP!

Um abraço

D

a blza
eu fiz isso e nao ta dando certo mas e pq eu nao add o jpanel ao frame vlw vo tenta aki qualquer coisa posto aki

vini.roggia

.

vini.roggia

Copiei esse código para dentro da minha classe TelaMenu e gostaria de saber como faço para utiliza-lo.
O que eu coloco no meu contrutor para que por exemplo o meu JPanel pnUser tenha a imagem fundo.jpg como background?

M

como fazer para chamar essa classe no meu projeto ?
ja adicionei essa classe ao pacote

ViniGodoy

Igual vc adicionaria um painel qualquer.

jedsc91

eu to com probelma c/ o setImage(String) dessa classe,
eu coloco o caminho da imagem, mas ele da erro dizendo q ele não encontra o caminho dela…
eu usei o msm caminho em um icone de um botão e deu certinho…
eu coloquei dentro de um try normalz…

ViniGodoy

Pode colocar aqui o código que deu certo e o que deu errado?

jedsc91
vai aew parte do código....
jipImagem = new JImagePanel();
  [code]jl=new JLabel();   




try{
            jipImagem.setImage("/jogo/imagens/unidade2.gif");//esse não encontrou o arquivo
        }catch(IOException i){
            JOptionPane.showMessageDialog(null, i.getMessage());
        }




      jl.setIcon(new javax.swing.ImageIcon(getClass().getResource("/jogo/imagens/unidade2.gif")));//esse deu certu

devo te entendido errado a classe, naum se pode passa como parametro o caminho da imagem??

ViniGodoy

getResource é uma coisa. Um file é outra.

O imagepanel pede o caminho de um File, não de um Resource.

Adicione os seguintes métodos no seu ImagePanel:

public JImagePanel(InputStream imgSrc) throws IOException
{
    this(ImageIO.read(imgSrc));
}

public void setImage(InputStream imgSrc) throws IOException
{
   setImage(ImageIO.read(imgSrc));
}
E então, chame-o assim:
jipImagem.setImage(getClass().getResourceAsStream("/jogo/imagens/unidade2.gif"));
jedsc91

Valew msm, vo testa hj o código.

jedsc91

desculpa incomoda de novo :oops:
é q eu procurei e não achei solução…=/
mas é q eu testei o código e qnd eu fui implementa ele me retorna um erro dizendo q :
non-static method getClass() cannot be referenced from a static context

evertonsilvagomesjav
jedsc91:
desculpa incomoda de novo :oops: é q eu procurei e não achei solução....=/ mas é q eu testei o código e qnd eu fui implementa ele me retorna um erro dizendo q : non-static method getClass() cannot be referenced from a static context

usa assim:

BufferedImage bi = ImageIO.read(this.getClass().getResource("/icon/LOGO.png"));

			seuImagePanel = new JImagePanel(bi);
			
			this.getContentPane().add(seuImagePanel);

lembrando que sua imagem tem que estar dentro do src

jedsc91

vlw msm everton, vo testa ainda hj esse código, brigadao msm pela ajuda :smiley:

tiagocampos65

No JInternelFrame é só você add um JLabel no BorderLayout.CENTER e inserir uma imagem no JLabel.

O único porém é que você terá que implementar um método para redimensionar a tela conforme o tamanho do Form.

D

Pessoal, estou com programa q adiciona a um jPanel vários jLabel com uma imagem em cada jLabel, agora estou precisando modificar o tamanho da imagem q eu inseri em cada jLabel. Então o ViniGodoy me recomendou a classe JImagePanel em lugar dos JLabel, só q com o codigo q eu implementei ñ esta adicionando nada ao jPanel principal. Ta ai o codigo

JImagePanel novo = null;
                            try {
                                novo = new JImagePanel(aux);  // aux é uma String contendo o caminho
                                novo.setFillType(JImagePanel.FillType.RESIZE);
                                novo.setSize(100, 100);
                                novo.setImage(aux);
                            } 

                            catch (IOException ex) {
                                Logger.getLogger(Interface_TrView.class.getName()).log(Level.SEVERE, null, ex);
                            }
                                                      
                             jPanel1.add(novo);
                             jPanel1.repaint();
                             jPanel1.validate();
                             JOptionPane.showMessageDialog(null, novo);
                            // aqui nesse JOptionPane mostra a imagem q eu quero, só q no painel principal ñ mostra nada,
                            // e ainda por cima no metodo jPanel1.getComponentCount() que é o metodo q retorna 
                            //a quantidade de componentres do painel ta retornando zero
habinovich

Uma duvida Vini…

gostaria de saber se com a sua class da para fazer o seguinte…

to criando uma tela para cadastro de cliente e nele gostaria colocar um Jpanel para receber a foto do cliente cadastrado…
ter a opção para Upa a foto do pc para uma pasta ou banco do sistema…

att…

ViniGodoy

É uma classe do Swing, para aplicações desktop. O que vc quer dizer com “upar”?

habinovich

to usando para desktop msm, UPar q to falando e carregar a foto de qualquer pasta no pc para uma pasta ou banco no sistema…

Ja tenho aki minha JPanel e Jbutton para abrir uma JDialog… que va abrir o local de busca da Imagem.

ViniGodoy

O JImagePanel só exibe imagens.

O resto é você que tem que fazer com o Java.

habinovich

vc poderia me dar uma dica de como fazer para ele fazer da forma dessa forma…

tem o campo la para receber a imagem carregada apartir do botao q criei para abrir a janela de busca da imagem…

jedsc91

cara, não seria o caso de vc buscar o caminho da imagem… talvez vc poderia copiar essa imagem buscada para uma pasta especifica, daew vc guarda no seu B.D. somente o novo caminho da imagem… vc implementa um atributo em sua classe com o caminho da imagem, qnd a pessoa pesquisar o cliente o programa retorna o caminho da imagem dele, então vc usa o componente q suporta a imagem…

adriano_kahn

oi Viny… essa classe jImagePanel foi vc que desenvolveu? aonde baixo ela para usar no NetBeans?
obrigado

ViniGodoy

No site do projeto towel. O link está na minha assinatura.

O Mark também escreveu um tuto para ela:

X

Vini, sou bem iniciante e estou desenvolvendo uma interface toda q estou fazendo no netbeans pela tela de visualização da interface…
tem alguma maneira de eu usar essa classe q vc desenvolveu pra colocar uma imagem como plano de fundo através da tela de visualização??
vlw

ViniGodoy

Ainda não, para isso teremos que altera-la para ter um construtor vazio.

AssemblyXP

Vinny… tem como colocar um ZOOM nesse painel? dê uma dica… estou tentado aki e nada…

ViniGodoy

Sim, bastaria ajustar o AffineTransform antes do desenho.

AssemblyXP

como assim… ?? AffineTransform

estou tentando alterar no FILLTYPE incrementando um ZOO_IN que ajusta pelo tamanho que sera passado…

AssemblyXP

estou tentando colocar também um JScrollPane no JImagePanel… mais ta dando erro adicionando o componente

Criado 3 de abril de 2007
Ultima resposta 22 de mai. de 2012
Respostas 48
Participantes 20