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 : Sélectionner tout - Visualiser dans une fenêtre à part
Desktop.add(getJPanel(index,pack));
voici celui qui crée les JPanel :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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