Alguém saberia? -> agora Plano de fundo fácil fácil!

14 respostas
L

Ola pessoal, aprendi a "pintar" uma imagem no jPanel através do tutorial http://blog.kazao.net/2008/07/background-image-on-jpanel.html e http://blog.kazao.net/2008/07/resizing-image.html, ae a gente se empolga e quer um pouco mais. Tenho essa classe com uma classe interna:

a ideia eh trocar a imagem do jPanel quando eu quizer, pq no tutorial original ele coloca uma imagem predefinida.

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/*
 * ChangingPics.java
 *
 * Created on 21/04/2011, 14:39:03
 */

package teste;

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import javax.swing.ImageIcon;
import javax.swing.JComponent;
import javax.swing.JFileChooser;
import javax.swing.filechooser.FileNameExtensionFilter;
import javax.swing.plaf.PanelUI;

/**
 *
 * @author Dono
 */
public class ChangingPics extends javax.swing.JFrame {

    /** Creates new form ChangingPics */
    public ChangingPics() {
        initComponents();

        /* BackgroundUI p = new  BackgroundUI();
       System.out.println(p.getFilename()+"instanciating!");
       p.setFilename("d://b5623e15131.jpg");
       System.out.println(p.getFilename()+"After seting!");
      jPanel2.setUI(p);
     // jPanel2.repaint();*/
        ImageShow.setUI(new BackgroundUI());
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        jLabel1 = new javax.swing.JLabel();
        jLabel2 = new javax.swing.JLabel();
        ImagePath = new javax.swing.JTextField();
        searching = new javax.swing.JButton();
        ImageShow = new javax.swing.JPanel();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        jLabel1.setText("CHANGING THE BACKGROUND IMAGE");

        jLabel2.setText("Image:");

        ImagePath.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                ImagePathActionPerformed(evt);
            }
        });

        searching.setText("search");
        searching.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                searchingActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout ImageShowLayout = new javax.swing.GroupLayout(ImageShow);
        ImageShow.setLayout(ImageShowLayout);
        ImageShowLayout.setHorizontalGroup(
            ImageShowLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 247, Short.MAX_VALUE)
        );
        ImageShowLayout.setVerticalGroup(
            ImageShowLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 187, Short.MAX_VALUE)
        );

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                            .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup()
                                .addGap(85, 85, 85)
                                .addComponent(jLabel1))
                            .addGroup(layout.createSequentialGroup()
                                .addContainerGap()
                                .addComponent(jLabel2)
                                .addGap(18, 18, 18)
                                .addComponent(ImagePath, javax.swing.GroupLayout.PREFERRED_SIZE, 170, javax.swing.GroupLayout.PREFERRED_SIZE)))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(searching))
                    .addGroup(layout.createSequentialGroup()
                        .addGap(72, 72, 72)
                        .addComponent(ImageShow, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addContainerGap(58, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jLabel1)
                .addGap(18, 18, 18)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(ImagePath, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(searching)
                    .addComponent(jLabel2))
                .addGap(18, 18, 18)
                .addComponent(ImageShow, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(29, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>

    private void ImagePathActionPerformed(java.awt.event.ActionEvent evt) {
        // TODO add your handling code here:
    }

    private void searchingActionPerformed(java.awt.event.ActionEvent evt) {
         JFileChooser fc = new JFileChooser();
         fc.setMultiSelectionEnabled(false);
         fc.setDialogTitle("Selecione a foto do individuo");
         fc.setFileFilter(new FileNameExtensionFilter("JPG, GIF, PNG", "jpg", "gif", "png", "bmp"));
         if (fc.showOpenDialog(null) == 0) {
                  this.ImagePath.setText( fc.getSelectedFile().toString());

         }
    }

    /**
    * @param args the command line arguments
    */
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new ChangingPics().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify
    private javax.swing.JTextField ImagePath;
    private javax.swing.JPanel ImageShow;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JButton searching;
    // End of variables declaration

}
class BackgroundUI extends PanelUI {

     private String filename = "d://4c9c446a151.jpg";

    public String getFilename() {
        return filename;
    }

    public void setFilename(String filename) {
        this.filename = filename;
        System.out.println("No setFilename");
    }

    ImageIcon background = new ImageIcon(getFilename());


 @Override public void paint(Graphics g, JComponent c) {
          System.out.println("call paint");
          System.out.println(getFilename());
          int width = c.getWidth();
          int height = c.getHeight();
          float rasio_x = (float) width / background.getIconWidth();
          float rasio_y = (float) height / background.getIconHeight();
          BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
          Graphics2D g2 = image.createGraphics();
          AffineTransform at = AffineTransform.getScaleInstance(rasio_x, rasio_y);
          g2.drawImage(background.getImage(), at, null);
          g2.dispose();
          g.drawImage(image, 0, 0, null);
      }

    }

Ja tentei muitas coisas. A ultima coisa que tentei foi declarar uma string para, com os getter e setters, tentar inseri-la na ImageIcon background como já está feito na classe interna.

Uma coisa estranha que observei é que a classe BackgroundUI chama o metodo paint duas vezes. Eu descobri sem querer colocando um println dentro do metodo.

Lembrando quem quizer testar a classe tem que mudar o caminho da imagem!

Alguém teria uma ideia?

14 Respostas

ViniGodoy

Oi.

O tutorial que você leu é sobre criação de look&feels. Existem maneiras muito mais simples de criar componentes.
O ideal é criar um filho de JPanel, e sobrescrever seu método paintComponent.

Dê uma lida nos tutoriais de Java do Ponto V!
Eles cobrem em detalhes como funciona o ciclo de pintura do Swing.

L

Java do ponto V, não entendi, aqui no GUJ ou na SUN? Mais fácil que isso? sou novo em java, mas venho estudando colocar uma imagem no container e não vi forma mais fácil.

nem mesmo com a sua ImagePanel.

Eu enviei email para o autor do site onde aprendi, estou no aguardo.

ViniGodoy

Ponto V! é o nome do portal de desenvolvimento de jogos que sou dono, o link está na minha assinatura.
Temos uma sessão de Java onde explicamos a fundo o funcionamento do Java 2D:
http://www.pontov.com.br/site/index.php/java

Leia lá. Comece pelas informações gerais e depois vá para a sessão de Java2D.

ViniGodoy
linsspinho:
nem mesmo com a sua ImagePanel.

Como assim? O JImagePanel já está pronto e programado. Basta você dizer que imagem vai no fundo dele e ele a coloca automaticamente. Não é necessário nenhum tipo de programação adicional, nem conhecer o Java2D.

Veja um exemplo de uso:
import java.awt.Dimension;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JFrame;

import com.towel.swing.img.JImagePanel;

public class JImagePanelSingleTest {
	public static void main(String[] args) throws Throwable {
                //Criação do painel com a imagem no fundo
		JImagePanel panel = new JImagePanel(
				loadImage("/home/marcos/imgs/1.png"));

                //Colocação do painel no JFrame
		JFrame frame = new JFrame();
		frame.setPreferredSize(new Dimension(100, 100));
		frame.add(panel);
		frame.pack();
		frame.setLocationRelativeTo(null);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setVisible(true);
	}

	private static BufferedImage loadImage(String file) throws IOException {
		return ImageIO.read(new File(file));
	}
}

E isso já gera o seguinte resultado:
[img]http://markytechs.files.wordpress.com/2011/02/jimgpanelresize.png?w=92&h=102[/img]

L

ViniGodoy, gostaria de ter 20% da sua experiencia em java , por isso deveria concordar com voce. Mas como eu sou teimoso eu discordo :wink:.

olha essa background que é feito com um codigozinho de nada:
[url]http://www.flickr.com/photos/linsspinho/[telefone removido]/in/photostream[/url]

e o codigo SEM OS OUTROS COMPONENTES é claro!

/**
*
* @author  Mr. Kazao
*/
public class JPanelBackgroundImage extends javax.swing.JFrame {

  /** Creates new form JPanelBackgroundImageResize */
  public JPanelBackgroundImage() {
      initComponents();
      container.setUI(new BackgroundUI());
  }

   class BackgroundUI extends PanelUI {

      ImageIcon background = new ImageIcon("d://4c9c446a151.jpg");
      @Override
      public void paint(Graphics g, JComponent c) {
          int width = c.getWidth();
          int height = c.getHeight();
          float rasio_x = (float) width / background.getIconWidth();
          float rasio_y = (float) height / background.getIconHeight();
          BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
          Graphics2D g2 = image.createGraphics();
          AffineTransform at = AffineTransform.getScaleInstance(rasio_x, rasio_y);
          g2.drawImage(background.getImage(), at, null);
          g2.dispose();
          g.drawImage(image, 0, 0, null);
      }
  }

A sua chama um método static que throws exception e depois chama uma classe(JImagePanel) que é muito grande, os newbies como eu se assustam só de ver!! :)
Agora a sua ImagePanel realmente deve fazer melhores implementações, por exemplo o que eu quero fazer acho que nao vai dá pra fazer com essa do Tutorial.
Mas vou esperar a resposta do dono do Tutorial.

Gostaria de saber se posso mudar o título do deste poste ? de " Alguém saberia?" para "Plano de fundo fácil fácil!!"

ViniGodoy

Sim, mas a graça do JImagePanel é que ele já está pronto. Você só precisa usa-lo, não precisa entendê-lo. Você pode até baixar o towel.jar e usar sem nem ler seu código fonte.

O que ele tem a mais é como alterar a política de redimensionamento da imagem. Ele permite escolher se você quer a imagem lado-a-lado, centralizada ou redimensionada (como no Windows). Mas o uso disso é opcional. O mesmo resultado que vc me passou vc faz com o JImagePanel em apenas uma única linha de código.

Na verdade, o seu método paint é muito similar ao método paintComponent que o JImagePanel tem internamente.

O IOException é padrão para qualquer método que carregue uma imagem. Ele é disparado por quem carrega, para avisar que, por exemplo, o arquivo de imagens não existe. Se você não sabe lidar com exceções, volte um pouco antes no básico do Java antes de usar o Swing. O construtor que recebe um BufferedImage não dispara exceção nenhuma.

Não sei como vc está montando as telas, mas no JImagePanel o mesmo código ficaria assim:

try { JImagePanel imgPanel = new JImagePanel("d://4c9c446a151.jpg"); } catch (IOException e) { //Ocorre se o arquivo não existir ou não for uma imagem e.printStackTrace(); }

L

O cara respondeu!!! kkk, acho que o cara fez uma gabiarra muito massa!! heheheh

Então viniGodoy, pessoal, agora sim, ficou fácil trabalhar com imagem em interface gráfica NÃO SO PARA PLANO DE FUNDO, mas para qualquer tipo de implementação.
apesar de um dono do tutorial ter feita uma coisa provavelmente errada, eu não sei, os especialistas de plantão que devem dizer!

se voces prestarem atenção ele instanciou (também) a variavel “background” dentro do setFilename da classe interna e agora posso selecionar uma foto atraves do FILECHOOSER e ela aparece no Painel menor.

E o melhor que está funcionando com a implementação que eu queria.

estou fazendo um aplicativo de cadastro de pessoas, na tela principal tem uma tabela que é preenchida pelo banco de dados, quando eu clico na linha, há um painel ao lado da tabela que mostra a foto da pessoa da
linha selecionada e está funcionando perfeitamente e rapido.

NÃO TESTEM ESSA CLASSE, EU APAGUEI ALGUNS CODIGOS DOS COMPONENTES PQ TAVA MUITO GRANDE HORIZONTALMENTE, USEM A PRIMEIRA COM ALGUMAS MUDANÇAS DESTA

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/*
 * TrocandoImagem.java
 *
 * Created on 21/04/2011, 14:39:03
 */
package teste;

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import javax.swing.ImageIcon;
import javax.swing.JComponent;
import javax.swing.JFileChooser;
import javax.swing.JPanel;
import javax.swing.filechooser.FileNameExtensionFilter;
import javax.swing.plaf.PanelUI;

/**
 *
 * @author Dono
 */
public class ChangingPic extends javax.swing.JFrame {

    /** Creates new form TrocandoImagem */
    public ChangingPic() {
        initComponents();
                
        ImageShow.setUI(new BackgroundUI());
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        jLabel1 = new javax.swing.JLabel();
        jLabel2 = new javax.swing.JLabel();
        ImagePath = new javax.swing.JTextField();
        searching = new javax.swing.JButton();
        ImageShow = new javax.swing.JPanel();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        jLabel1.setText("CHANGING THE BACKGROUND IMAGE");

        jLabel2.setText("Image:");

        ImagePath.addActionListener(new java.awt.event.ActionListener() {

            public void actionPerformed(java.awt.event.ActionEvent evt) {
                ImagePathActionPerformed(evt);
            }
        });

        searching.setText("search");
        searching.addActionListener(new java.awt.event.ActionListener() {

            public void actionPerformed(java.awt.event.ActionEvent evt) {
                searchingActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout ImageShowLayout = new javax.swing.GroupLayout(ImageShow);
        ImageShow.setLayout(ImageShowLayout);
        ImageShowLayout.setHorizontalGroup(
                ImageShowLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGap(0, 247, Short.MAX_VALUE));
        ImageShowLayout.setVerticalGroup(
                ImageShowLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGap(0, 187, Short.MAX_VALUE));

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
 
    }// </editor-fold>

    private void ImagePathActionPerformed(java.awt.event.ActionEvent evt) {
        // TODO add your handling code here:
    }

    private void searchingActionPerformed(java.awt.event.ActionEvent evt) {
        JFileChooser fc = new JFileChooser();
        fc.setMultiSelectionEnabled(false);
        fc.setDialogTitle("Selecione a foto do individuo");
        fc.setFileFilter(new FileNameExtensionFilter("JPG, GIF, PNG", "jpg", "gif", "png", "bmp"));
        if (fc.showOpenDialog(null) == 0) {
            //this.ImagePath.setText(fc.getSelectedFile().toString());
            BackgroundUI ui = new BackgroundUI();
            ui.setFilename(fc.getSelectedFile().toString());
            ImageShow.setUI(ui);
           //((JPanel) getContentPane()).setUI(ui);
        }
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {

            public void run() {
               new ChangingPic().setVisible(true);
            }
        });
    }
    // Variables declaration - do not modify
    private javax.swing.JTextField ImagePath;
    private javax.swing.JPanel ImageShow;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JButton searching;
    // End of variables declaration
}

class BackgroundUI extends PanelUI {

    private String filename = "C://picServidor//123456789.JPG";

    public String getFilename() {
        return filename;
    }

    public void setFilename(String filename) {
        this.filename = filename;
        System.out.println("No setFilename");
        background = new ImageIcon(getFilename());
    }
    ImageIcon background = new ImageIcon(getFilename());

    @Override
    public void paint(Graphics g, JComponent c) {
        System.out.println("call paint");
        System.out.println(getFilename());
        int width = c.getWidth();
        int height = c.getHeight();
        float rasio_x = (float) width / background.getIconWidth();
        float rasio_y = (float) height / background.getIconHeight();
        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        Graphics2D g2 = image.createGraphics();
        AffineTransform at = AffineTransform.getScaleInstance(rasio_x, rasio_y);
        g2.drawImage(background.getImage(), at, null);
        g2.dispose();
        g.drawImage(image, 0, 0, null);
    }
}

viniGodoy esqueci de dizer que o problema da sua classe ou de toda implementação, além do que ja falei, é que para instanciar vc tem que por exemplo:

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();

entao soma ae mais quatro linhas de código.

enquanto que com esse tuto:

seuPanel.setUI(new backgroundUI); // para plano de fundo

--------------------------------------OU------------------------------------------- 

  BackgroundUI ui = new BackgroundUI();         //para mudar a imagem
  ui.setFilename(fc.getSelectedFile().toString());
  seuPanel.setUI(ui);

Não leve isso como uma ofensa, so estou dizendo que este é mais fácil, mas pode não ser correto.

quero aprender a usar a sua classe porque acredito que seja o mais correto a se fazer, mas eu já tentei uma vez e não consegui, acho que é uma questão de tempo.

Valeu Feliz Pascoa para todos.

ViniGodoy

Peraí, vc está fazendo errado.

O certo seria:

BufferedImage img = ImageIO.read(new ByteArrayInputStream(rs.getBytes("Imagem_Log")));    //ok
quadroImagem = new JImagePanel(img);
painelImagem.add(quadroImagem);

Não é necessário chamar o setImage. Como vc passou a imagem no construtor, é essa que ele vai usar por padrão.
Também não é necessário dar repaint.

A linha:

É equivalente a linha que está dentro da sua classe (em algum lugar esse código terá que aparecer em ambas as implementações, pois não tem como fugir da carga da imagem):

Só que minha classe não assume nenhuma imagem “por padrão”, pois não seria possível disponibiliza-la para outros desenvolvedores se eu fizesse isso.

Esse trecho:

Só está complicado assim pq vc lê do BD, coisa que vc não fez com o seu exemplo. Se vc tiver um filename (como vc fez no seu) pode usar diretamente no construtor do JImagePanel:

O seu exemplo, do jeito que está, exigiria que você gravasse a imagem num arquivo, para depois lê-la novamente, uma operação idiota (especialmente pq o disco é lento).

Para substituir a imagem, você usa o setImage. Basta fazer:

Também sem necessidade de repaint() ou de chamar o setUI.

L

Na realidade eu peguei esse exemplo aqui mesmo com a dúvida de linkel aqui:
http://www.guj.com.br/java/95976-imagem-em-jpanel/2

e deu pra sentir que ele suou muito para conseguir implementa-la. Na minha tentativa eu fiz tantas mudanças que nem sei o que mudei.

Eu não ia nem responder mais. Nem fiquei ofendido, porque eu sou NEWBIE mesmo, mas fiquei curioso com sua frase “uma operação idiota”.

então você quer dizer que: quando se tem um program que manipula imagem, digamos, cadastro de clientes com fotos, cadastro de funcionarios, ou algo similar, o certo seria, assim

que o programa iniciar carregar todas as imagens para a memória? Pra mim não faz sentido pq se eu for carregar na memoria as imagens que terá no programa que estou fazendo,

que pode chegar a, mais ou menos 1000 cadastros, onde cada um pode chegar a ter 5 fotos, multiplicado por + ou - 500k de tamanho, seria 2,5GB, vamos arredondar para 2GB. Não é ruim para um servidor dedicado, mas para um workstation talvez seria muito, até mesmo pq ele roda outras coisas.

mas eu poderia montar um workstation dedicado. É uma coisa a se pensar, mas será que eu preciso de carregamento rápido para mostrar algumas fotos?

Não sei brother, pra implementar o carregamento destas fotos na memória será um trabalhão. Não, eu vou continuar gravando as fotos em arquivos.

Quem sabe um dia que estiver melhor em java.

Acho que vc deveria dá um desconto. vc desenvolve games por isso precisa de um processamento rapido.

M

Olá pessoal, sou novo aqui no GUJ…
sou um pouco novo ainda em Java e estou com um problema…
desculpem-me se precisava criar um outro tópico…
o problema é o seguinte: tenho que ter em um JFrame uma imagem e um gráfico basicamente, as outras coisas são botões e menus, mas com isso não houve problema…
bom, pra resolver isso, resolvi criar dois painéis JPanel, um para a imagem e outro para o grafico…
para traçar o grafico usei paintComponent que, no caso, fica numa classe que criei chamada DrawGraphic, e o layout do JFrame foi configurado com o GridBagLayout
o problema surge quando vou adicionar o grafico ao segundo painel, simplesmente não é adicionado…
alguém sabe?

ViniGodoy

O que o linkel suou não foi o uso do JImagePanel. Foi que ele queria carregar a imagem de um ResultSet do banco de dados, e não de um arquivo gravado no disco.
Por isso a inicialização dele foi um pouquinho mais complicada. Mas a complicação está na carga da imagem, não no JImagePanel em si.

E essa era uma confusão que ele fazia no tópico, pois ele não estava sabendo como carregar do banco e estava desconfiando que o erro estivesse no JImagePanel.

Não, você não entendeu. O que não faz sentido é:

  1. Ler do banco de dados para a memória;
  2. Gravar da memória em arquivo;
  3. Ler do arquivo para a memória;
  4. Exibir o que está na memória na tela.

Note que os passos 2 e 3 são completamente dispensáveis.
Eles só ocorrem pq o programador não soube como converter o formato que a imagem está no banco, para um formato que o java entenda como imagem.

Se você já leu do banco, e já está na memória, o correto é simplesmente fazer:

  1. Ler do banco para a memória;
  2. Exibir o que está na memória na tela.

É isso que aquele código com o ByteArrayInputStream faz.

E, lógico, você não tem que carregar todas as imagens para a memória, só a que for exibida.

O que eu disse, é que, se você fosse usar o seu programa, do jeito que está, e tivesse na mesma situação do linkel, em que você tem uma imagem dentro de um registro do banco, aí sim, você seria obrigado a gravar essa imagem no disco, para ler novamente a partir da sua classe, já que sua classe dá como único suporte a carga do disco. Sacou? No caso do ImagePanel, já inclui diversos construtores, justamente pq eles cobrem diversas origens da imagem: arquivos, sockets, memória, arquivos de recursos, etc.

Se vc já grava em disco, no lugar de gravar em banco, então pode usar sua classe sem preocupação. E se for usar a JImagePanel, pode usar o construtor mais simples, onde vc faz somente:

ViniGodoy

Só um detalhe. Faz tempo que a implementação do JImagePanel mudou. Se vc quiser pegar a versão mais atual, pegue do projeto towel. O link está na minha assinatura.

ViniGodoy

manBatman:
Olá pessoal, sou novo aqui no GUJ…
sou um pouco novo ainda em Java e estou com um problema…
desculpem-me se precisava criar um outro tópico…
o problema é o seguinte: tenho que ter em um JFrame uma imagem e um gráfico basicamente, as outras coisas são botões e menus, mas com isso não houve problema…
bom, pra resolver isso, resolvi criar dois painéis JPanel, um para a imagem e outro para o grafico…
para traçar o grafico usei paintComponent que, no caso, fica numa classe que criei chamada DrawGraphic, e o layout do JFrame foi configurado com o GridBagLayout
o problema surge quando vou adicionar o grafico ao segundo painel, simplesmente não é adicionado…
alguém sabe?

Crie um tópico para isso, e anexe o código lá. Só com o que vc escreveu ficou um pouco abstrato.

L

manBatman, se vc quer coisa pra newbie eu posso te ajudar, agora se vc quizer uma implementação mais elaborada, certinha, sem gambiarra, vc vai ter que apelar p/ os cara mais

experientes. vc pode olhar aqui: http://www.guj.com.br/java/95976-imagem-em-jpanel/2

O que seria um gráfico para você? é dinamico ou estático?

para imagem eu acredito que a implementação acima é mais fácil. se vc quizer testar roda a primeira implementação que está imcompleta, depois copia e substitui esse metodo:
private void searchingActionPerformed(java.awt.event.ActionEvent evt) {
        JFileChooser fc = new JFileChooser();
        fc.setMultiSelectionEnabled(false);
        fc.setDialogTitle("Selecione a foto do individuo");
        fc.setFileFilter(new FileNameExtensionFilter("JPG, GIF, PNG", "jpg", "gif", "png", "bmp"));
        if (fc.showOpenDialog(null) == 0) {
            
            BackgroundUI ui = new BackgroundUI();
            ui.setFilename(fc.getSelectedFile().toString());
            seuPanel.setUI(ui);                                        //este é pra pintar no  panel
           //((JPanel) getContentPane()).setUI(ui);        //este é pra pintar no frame que o panel está
        }
    }
depois vc copia essa classe, pode ser em uma nova classe separada ou do jeito que está.
class BackgroundUI extends PanelUI {

    private String filename = "";  //pode começar assim, o panel fica preto
     private String filename = "SUA_IMAGEM.JPG"; //ou assim

    public String getFilename() {
        return filename;
    }

    public void setFilename(String filename) {
        this.filename = filename;
        
        background = new ImageIcon(getFilename());
    }
    ImageIcon background = new ImageIcon(getFilename());

    @Override
    public void paint(Graphics g, JComponent c) {
       
        int width = c.getWidth();
        int height = c.getHeight();
        float rasio_x = (float) width / background.getIconWidth();
        float rasio_y = (float) height / background.getIconHeight();
        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        Graphics2D g2 = image.createGraphics();
        AffineTransform at = AffineTransform.getScaleInstance(rasio_x, rasio_y);
        g2.drawImage(background.getImage(), at, null);
        g2.dispose();
        g.drawImage(image, 0, 0, null);
    }
}

dependendo do que vc escolher, posta ae.

Criado 21 de abril de 2011
Ultima resposta 23 de abr. de 2011
Respostas 14
Participantes 3