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?