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 :
voici celui qui crée les JPanel :
Code : Sélectionner tout - Visualiser dans une fenêtre à part Desktop.add(getJPanel(index,pack));
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 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]; }
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
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(); } } } }
Si vous avez des idées sur d'ou vient les erreurs ou alors sur comment optimisez ce code, j'en serai fort aise
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); }
Partager