Imagem em JPanel

Ué, o ImageIO.read funciona estilo o write, mas ao contrário.

BufferedImage img = ImageIO.read(new ByteArrayInputStream(rs.getBytes("Imagem_Log")));

Engraçado com o invalidate não funcionar… Eu sempre fiz assim e funcionou…

Outra coisa… estava olhando o seu código ali atrás…

Vc não retira o ImagePanel anterior do painelImagem antes de adicionar um novo ImagePanel?

Faça o seu ImagePanel permitir a modificação da imagem (igual o meu já faz). Então, posicione o ImagePanel apenas uma vez e altere somente a imagem que está dentro dele. Não esqueça de fazer o ImagePanel chamar invalidate a cada troca da imagem.

Brother…
Então, será que dá pra você fazer um apanhado de como deveria estar e postar aqui, com base no que eu já te passei???
Já tentei de tudo que eu ví no google, no GUJ e nada…
E valeu por tanta disposição, rsrrsrsrs…

[quote=ViniGodoy]Outra coisa… estava olhando o seu código ali atrás…
Vc não retira o ImagePanel anterior do painelImagem antes de adicionar um novo ImagePanel?
Faça o seu ImagePanel permitir a modificação da imagem (igual o meu já faz). Então, posicione o ImagePanel apenas uma vez e altere somente a imagem que está dentro dele. Não esqueça de fazer o ImagePanel chamar invalidate a cada troca da imagem.
[/quote]
Cara, como assim?
Não entendi!!!

Você está dando add num novo JImagePanel.
Mas, na segunda vez que você selecionar uma imagem, já vai ter um JImagePanel lá!!!

O que você faz com ele?

O que eu falei é fazer com que o seu JImagePanel suporte o método setImage. Assim, você adiciona o JImagePanel no painelImagem uma única vez.
E toda vez que carregar uma imagem do banco só chama o método setImage.

Bom, vamos ver se entendi…
Quer dizer que quando eu implemento JImagePanel quadroImagem = new JImagePanel(img) e então painelImage.add(quadroImagem) eu não preciso fazer isso novamente para mostrar outra imagem???
Então posso fazer isso no construtor do formulário e apenas modificar a imagem com setImage???
Você disse que eu devo fazer como você já fez com a classe JImagePanel, mas eu sou inexperiente ainda, e você é fera, então não tem como você postar sua classe JImagePanel para eu me basear???

O ratao já postou o link, logo no início dessa thread:
http://www.guj.com.br/posts/list/56248.java#295271

Aí, brother ViniGodoy!!!
Consegui!!! Ufaaaaa!!!
Estou muito agradecido pelas dicas… Foram muito úteis!
Então segue a maneira como consegui para quem passar pelo mesmo problema…
Adicionei a classe JImagePanel com a implementação dos demais métodos…

[code]import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Paint;
import java.awt.TexturePaint;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JPanel;

public class JImagePanel extends JPanel {
private BufferedImage image = null;
private FillType fillType = FillType.RESIZE;

public JImagePanel(BufferedImage img) {
    setImage(img);
}

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

public JImagePanel(String fileName) throws IOException {
    this(new File(fileName));
}

public final void setImage(BufferedImage img) {
    if (img == null)
        throw new NullPointerException("Sem imagem para processar!");
    this.image = img;
    invalidate();
}

public void setImage(File img) throws IOException {
    setImage(ImageIO.read(img));
}

public void setImage(String fileName) throws IOException {
    setImage(new File(fileName));
}

public BufferedImage getImage() {
    return image;
}

protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    Graphics2D g2d = (Graphics2D) g.create();
    fillType.drawImage(this, g2d, image);        
    g2d.dispose();
}

public FillType getFillType() {
    return fillType;
}

public void setFillType(FillType fillType) {
    if (fillType == null)
        throw new IllegalArgumentException("Invalid fill type!");
    this.fillType = fillType;
    invalidate();
}

public static enum FillType {
    RESIZE {
        public void drawImage(JPanel panel, Graphics2D g2d, BufferedImage image) {
            g2d.drawImage(image, 0, 0, panel.getWidth(), panel.getHeight(),
                    null);
        }
    },
    
    CENTER {
        public void drawImage(JPanel panel, Graphics2D g2d, BufferedImage image) {
            int left = (panel.getHeight() - image.getHeight()) / 2;
            int top = (panel.getWidth() - image.getWidth()) / 2;
            g2d.drawImage(image, top, left, null);
        }
    },

    SIDE_BY_SIDE {
        public void drawImage(JPanel panel, Graphics2D g2d, BufferedImage image) {
            Paint p = new TexturePaint(image, new Rectangle2D.Float(0, 0, image.getWidth(), image.getHeight()));
            g2d.setPaint(p);
            g2d.fillRect(0, 0, panel.getWidth(), panel.getHeight());
        }
    };
    public abstract void drawImage(JPanel panel, Graphics2D g2d, BufferedImage image);
}

}[/code]
Depois, instanciei um “quadroImagem” logo no início da classe onde quero visualizar as imagens resgatadas do banco…

private JImagePanel quadroImagem = null;

E então resgato a imagem adicionando-a ao quadroImagem e o quadroImagem ao JPanel, toda vez que precisar mudar a imagem. Note que não foi necessário retirar o quadroImagem para adicionar outra imagem devido ao bem pensado método “setImage()”… Outro ponto positivo que encherguei foi o resgate dos bytes para uma BufferedImage sem a utilização de codecs, como alguns fazem, pois assim eu consegui visualizar com esse mesmo código imagens do tipo jpg, png e gif (que foram as que testei)…

ResultSet rs = stmt.executeQuery("Select Imagem_Log from Logomarcas where Identificacao_Log = '"+identLogo+"'"); if (rs.next()) { BufferedImage img = ImageIO.read(new ByteArrayInputStream(rs.getBytes("Imagem_Log"))); if (quadroImagem == null) quadroImagem = new JImagePanel(img); quadroImagem.setImage(img); painelImagem.add(quadroImagem); painelImagem.repaint(); } rs.close();
Agora preciso apenas redimensionar a imagem ao tamanho do JPanel mantendo o aspect ratio da imagem, porque o redimensionar dessa classe altera tanto a altura quanto a largura para as dimensões exatas do JPanel…
Se souber como vou fazer isso, agradeceria…
Um abraço!

Hehehehehehehhehehe…
Consegui, ViniGodoy!!!
Botei a cuca pra funcionar aqui para uns cálculos e consegui adicionar duas funcionalidades na classe JImagePanel…
Bem simples, porém muito útil, pelo menos para a minha aplicação…
O RESIZE da classe JImagePanel redimensiona tanto a altura da imagem quanto a largura à área total do JPanel, sendo assim, se a dimensão da imagem for 600 x 300 e a do JPanel for 200 x 200 a imagem será então esticada pra preencher todo o JPanel, e isso é um problema se você precisa visualizar as dimensões reais da imagem… Acho que a solução para isso se chama Aspect Ratio; por isso criei duas funções com esse nome para a classe JImagePanel; uma, a ASPECT_RATIO, calcula as dimensões fieis da imagem referentes à largura ou altura do JPanel e visualiza na posição padrão (eixo 0,0; portanto, à esquerda); a outra, a ASPECT_RATIO_CENTER faz o mesmo calculo da primeira mas centraliza a imagem no JPanel obtendo o eixo X,Y da comparação entre os aspectos…
Para mim vai ser muito útil, e queria contribuir pela disposição em me ajudar…
Olha o que acrescentei…

[code] ASPECT_RATIO {
public void drawImage(JPanel panel, Graphics2D g2d, BufferedImage image) {
int larguraImg = image.getWidth(), alturaImg = image.getHeight();
int largura = 0, altura = 0;
double aspectoImg = larguraImg / alturaImg;
double aspectoPanel = panel.getWidth() / panel.getHeight();

            if (larguraImg > panel.getWidth() || alturaImg > panel.getHeight()) {
                if (aspectoImg == aspectoPanel) {
                    largura = panel.getWidth();
                    altura = panel.getHeight();
                }
                if (aspectoImg != aspectoPanel) {
                    if ((larguraImg / panel.getWidth()) > (alturaImg / panel.getHeight())) {
                        largura = panel.getWidth();
                        altura = (largura * alturaImg) / larguraImg;
                    }
                    if ((larguraImg / panel.getWidth()) < (alturaImg / panel.getHeight())) {
                        altura = panel.getHeight();
                        largura = (altura * larguraImg) / alturaImg;
                    }
                }
            }
            else {
                largura = image.getWidth();
                altura = image.getHeight();
            }
            g2d.drawImage(image, 0, 0, largura, altura, null);
        }
    },
    
    ASPECT_RATIO_CENTER {
        public void drawImage(JPanel panel, Graphics2D g2d, BufferedImage image) {
            int larguraImg = image.getWidth(), alturaImg = image.getHeight();
            int largura = 0, altura = 0;
            double aspectoImg = larguraImg / alturaImg;
            double aspectoPanel = panel.getWidth() / panel.getHeight();
            
            if (larguraImg > panel.getWidth() || alturaImg > panel.getHeight()) {
                if (aspectoImg == aspectoPanel) {
                    largura = panel.getWidth();
                    altura = panel.getHeight();
                }
                if (aspectoImg != aspectoPanel) {
                    if ((larguraImg / panel.getWidth()) > (alturaImg / panel.getHeight())) {
                        largura = panel.getWidth();
                        altura = (largura * alturaImg) / larguraImg;
                    }
                    if ((larguraImg / panel.getWidth()) < (alturaImg / panel.getHeight())) {
                        altura = panel.getHeight();
                        largura = (altura * larguraImg) / alturaImg;
                    }
                }
            }
            else {
                largura = image.getWidth();
                altura = image.getHeight();
            }
            
            // centraliza a imagem no JPanel...
            int left = (panel.getHeight() - altura) / 2;
            int top = (panel.getWidth() - largura) / 2;
            
            g2d.drawImage(image, top, left, largura, altura, null);
        }
    };[/code]

Um grande abraço!
Até que enfim posso finalizar esse post, rsrsrsrsrs…
Valeuuuuuuuuuu!!!

Legal, parabéns! :slight_smile:

Heheheh…
Olha eu aqui de novo, rsrsrsrs…
Só quero corrigir um erro no calculo do ASPECT_RATIO… É preciso fazer o casting das dimensões para double antes da comparação, pois em algumas imagens a aspecto não era respeitado pelas dimenões estarem arredondadas ou truncads para inteiro… E então só precisava comparar os aspectos…
Agora, o cálculo correto…

[code]ASPECT_RATIO {
public void drawImage(JPanel panel, Graphics2D g2d, BufferedImage image) {
int larguraImg = image.getWidth(), alturaImg = image.getHeight();
int largura = 0, altura = 0;
double aspectoImg = (double) larguraImg / (double) alturaImg;
double aspectoPanel = (double) panel.getWidth() / (double) panel.getHeight();

            if (larguraImg > panel.getWidth() || alturaImg > panel.getHeight()) {
                if (aspectoImg == aspectoPanel) {
                    largura = panel.getWidth();
                    altura = panel.getHeight();
                }
                if (aspectoImg > aspectoPanel) {
                    largura = panel.getWidth();
                    altura = (largura * alturaImg) / larguraImg;
                }
                if (aspectoImg < aspectoPanel) {
                    altura = panel.getHeight();
                    largura = (altura * larguraImg) / alturaImg;
                }
            }
            else {
                largura = image.getWidth();
                altura = image.getHeight();
            }
            g2d.drawImage(image, 0, 0, largura, altura, null);
        }
    },
    
    ASPECT_RATIO_CENTER {
        public void drawImage(JPanel panel, Graphics2D g2d, BufferedImage image) {
            int larguraImg = image.getWidth(), alturaImg = image.getHeight();
            int largura = 0, altura = 0;
            double aspectoImg = (double) larguraImg / (double) alturaImg;
            double aspectoPanel = (double) panel.getWidth() / (double) panel.getHeight();
            
            if (larguraImg > panel.getWidth() || alturaImg > panel.getHeight()) {
                if (aspectoImg == aspectoPanel) {
                    largura = panel.getWidth();
                    altura = panel.getHeight();
                }
                if (aspectoImg > aspectoPanel) {
                    largura = panel.getWidth();
                    altura = (largura * alturaImg) / larguraImg;
                }
                if (aspectoImg < aspectoPanel) {
                    altura = panel.getHeight();
                    largura = (altura * larguraImg) / alturaImg;
                }
            }
            else {
                largura = image.getWidth();
                altura = image.getHeight();
            }
            
            // centraliza a imagem no JPanel...
            int left = (panel.getHeight() - altura) / 2;
            int top = (panel.getWidth() - largura) / 2;
            
            g2d.drawImage(image, top, left, largura, altura, null);
        }
    };[/code]

Um abraço!

Aí, ViniGodoy, desculpe estar voltado nesse post, mas tenho uma nova empreitada para realizar relacionado a esse assunto…
Preciso adicionar uma image ao JPanel fazendo com que ele a pinte por cima da imagem já pintada, não apagando-a…
Ou, caso seja possível com BufferedImage, preciso pintar determinadas partes da imagem com cores diferentes…
Para não delongar este post criei um novo, específico para o meu problema…
Ficaria muito agradecido se me ajudasse novamente, porque imagino que você domine isso também…
O post é esse aí: http://www.guj.com.br/posts/list/96709.java#519240
Valeu!

Ja tentei de tudo e a imagem nao fica no panel
O maximo que consegui foi fazer ela aparecer e sumir bem rapido, isso depois da segunda tentativa na escolha de arquivo
Grava na Base tranquilo, mas nao aparece no Jpanel
acredito que recupera da base tambem, porque não da erro, mas não aparece no panel
ja tentei jlabel, jpanel, haa, ela chega a piscar com draw
ja tentei ajustando o metodo abaixo ai e nada:

public class JMeuPainel extends JPanel
{

Image im = new ImageIcon ( getClass ( ).getResource ( "/fundo.png" ) ).getImage ( );   

public void paintComponent ( Graphics g )   
{   
    super.paintComponent ( g );   
    int x = ( this.getWidth ( ) - im.getWidth ( null ) ) / 2;   
    int y = ( this.getHeight ( ) - im.getHeight ( null ) ) / 2;   
    g.drawImage ( im , x , y , this );   
}   

}
Oque eu faço para ela aparecer e permanecer na tela, não me importa o componente
Como que na pre visualização do JFileChoose a mardita fica la, bonitinha
:frowning:

Fera, invoque o método invalidate() sempre que for reescrever o método paintComponent() do JPanel, e adicione o método validate() e um repaint() logo depois do método paintComponent(), para o conteúdo ser repintado no JPanel…
Porque você não fez exatamente como eu fiz, numa classse separada, com os métodos para tratar a imagem separadamente?
Tentar simplificar, nesse caso, só piora, rsrsrsr!
Se quiser fazer como eu fiz e não entender pode perguntar que te explico parte por parte…
Um abraço!