Problème avec redimesionnement image...
Bonsoir,
dans mon appli, des qu'une certaine condition est remplie, j'ajoute un JPanel avec une image à l'intérieur à un JDesktopPane et je redimensionne l'image mais j'ai 2 problèmes : - 1. L'image ne se redimensionne pas comme il faut
2. Des qu'il doit afficher le deuxième JPanel, il me met le message d'erreur suivant :
Exception in thread "AWT-EventQueue-0" java.lang.OutOfMemoryError: Java heap space
Je me demande si c'est un problème de surcharge de la mémoire ou quelque chose du genre...
voici le code ou j'ajoute mon JPanel :
Code:
Desktop.add(getJPanel(index,pack));
voici celui qui crée les JPanel :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| private JPanel getJPanel(int index,int pack) {
short colonne = 0;
short ligne = 0;
int panelHeight = 110;
int panelWidth = 90;
double scaleValue = 1;
if(index < 5){colonne = (short)index;ligne = 0;}
else if(index < 10){colonne = (short)(index-5);ligne = 1;}
else if(index < 15){colonne = 0;ligne = 2;}
BufferedImage image = loader.loadImage("pack"+pack+"/"+index+".jpg");
if(image.getWidth() > image.getHeight())scaleValue = image.getWidth() / panelWidth;
if(image.getHeight() > image.getWidth())scaleValue = image.getHeight() / panelHeight;
BufferedImage imageScaled = scale(image,scaleValue);
if (panels[colonne][ligne] == null) {
panels[colonne][ligne] = new ImagePanel(imageScaled);
panels[colonne][ligne].setBounds(new java.awt.Rectangle(30+(100*colonne),45+(120*ligne),panelWidth,panelHeight));
}
return panels[colonne][ligne];
} |
voici la classe qui construit un JPanel avec une image dedans :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
| public final class ImagePanel extends JPanel {
public static final String IMAGE_PROPERTY = "ImagePanel.image";
private InnerListener innerListener = new InnerListener();
public ImagePanel(Image image) {
super();
addPropertyChangeListener(IMAGE_PROPERTY, innerListener);
setImage(image);
}
public void dispose() {
removePropertyChangeListener(IMAGE_PROPERTY, innerListener);
innerListener = null;
setImage(null);
}
public void setImage(Image image){ putClientProperty(IMAGE_PROPERTY, image);}
public Image getImage(){ return (Image) getClientProperty(IMAGE_PROPERTY);}
protected void paintComponent(Graphics graphics) {
super.paintComponent(graphics);
Image image = getImage();
if (image != null) {
graphics.drawImage(image, 0, 0, null);
}
}
private class InnerListener implements PropertyChangeListener {
public void propertyChange(PropertyChangeEvent event) {
String property = event.getPropertyName();
if (property.equals(IMAGE_PROPERTY)) {
Image image = getImage();
int width = 0;
int height = 0;
if (image != null) {
width = image.getWidth(null);
height = image.getHeight(null);
}
Dimension size = new Dimension(width, height);
setPreferredSize(size);
setMinimumSize(size);
repaint();
}
}
}
} |
et enfin le code que j'emploie pour redimensionner mon image :
Code:
1 2 3 4 5 6 7 8 9 10
| public static BufferedImage scale(BufferedImage bi, double scaleValue) {
AffineTransform tx = new AffineTransform();
tx.scale(scaleValue, scaleValue);
AffineTransformOp op = new AffineTransformOp(tx,
AffineTransformOp.TYPE_BILINEAR);
BufferedImage biNew = new BufferedImage( (int) (bi.getWidth() * scaleValue),
(int) (bi.getHeight() * scaleValue),
bi.getType());
return op.filter(bi, biNew);
} |
Si vous avez des idées sur d'ou vient les erreurs ou alors sur comment optimisez ce code, j'en serai fort aise :lol: