2009-08-04 7 views
0

J'ai un programme java que quand un bouton est cliqué, il met à jour l'image sur l'écran à l'image correspondante. cela fonctionnera pour les 15 premiers clics puis cela provoquera une erreur d'heapspace java. Je pense que c'est à cause de la façon dont je mets à jour le jpanel qui contient l'image buffered mais je ne suis pas sûr de la raison. Mon code pour obtenir rendre les JPanel contiennent la nouvelle image est,java gui changer l'image provoque une erreur d'espace de mémoire

public class extraScreenPanel { 

static JPanel screenPanel = new JPanel(new BorderLayout()); 

public static JPanel extraScreenPanel(int dispNum) 
{ 
    JLabel label = new JLabel("" + dispNum + ""); 
    label.setPreferredSize(new Dimension(800, 600)); 
    //label.setUI(new VerticalLabelUI(true)); 
    label.setVerticalAlignment(SwingConstants.TOP); 
    screenPanel = imgDisp(dispNum); 
    label.setForeground(Color.white); 
    label.setFont(new Font("Serif", Font.BOLD, 200)); 
    screenPanel.add(label, BorderLayout.PAGE_END); 

    return screenPanel; 
} 



public static JPanel imgDisp(int picNum) { 
    /* String url[] = new String[5000]; 
    String part1; 
    url[0] = "C:/PiPhotoPic/pic16.jpg"; 
    for(Integer i=1;i<5000;i++){ 
     if(i<10){part1 = "C:/temp/new0000000";} 
     else if(i<100){part1 = "C:/temp/new000000";} 
     else if(i<1000){part1 = "C:/temp/new00000";} 
     else {part1 = "C:/temp/new00000";} 
     String num = Integer.toString(i); 
     url[i]= part1 + num + ".jpg"; 
    } 
    if(picNum<0){picNum=0;} 
    String ref = url[picNum];*/ //this code is just to get specific ref for image location 
    BufferedImage loadImg = loadImage(ref); 
    JImagePanel panel = new JImagePanel(loadImg, 0, 0); 
    panel.setPreferredSize(new Dimension(800, 600)); 
    return panel; 
} 


public static class JImagePanel extends JPanel{ 
    private BufferedImage image; 
    int x, y; 
    public JImagePanel(BufferedImage image, int x, int y) { 
     super(); 
     this.image = image; 
     this.x = x; 
     this.y = y; 
    } 
    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     g.drawImage(image, x, y, null); 
    } 
} 


public static BufferedImage loadImage(String ref) { 
     BufferedImage bimg = null; 
     try { 

      bimg = javax.imageio.ImageIO.read(new File(ref)); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    BufferedImage bimg2 = resize(bimg,800,600); 
    return bimg2; 
} 


public static BufferedImage resize(BufferedImage img, int newW, int newH) { 
    int w = img.getWidth(); 
    int h = img.getHeight(); 
    BufferedImage dimg = dimg = new BufferedImage(newW, newH, img.getType()); 
    Graphics2D g = dimg.createGraphics(); 
    g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); 
    g.drawImage(img, 0, 0, newW, newH, 0, 0, w, h, null); 
    g.dispose(); 
    return dimg; 
} 

}

Et le code qui met à jour mon IUG est, il fonctionne en retirant le panneau de son panneau containg et readding ensuite à ce .

picPanel = imgDisp.imgDisp(num); 
    repaintPicPanel(); 

public static void repaintPicPanel() 
    { 
     picPanel.removeAll(); 
     menuPanel.remove(picPanel);; 
     menuPanel.add(picPanel, BorderLayout.LINE_START); 
    } 
+0

Pourriez-vous également mettre en forme le code de la dernière partie de votre code dans lequel vous mettez à jour le panneau contenant? – extraneon

Répondre

0

Connectez-vous avec jvisualvm (dans Java 6 JDK) et voyez où va votre mémoire.

0

Il est presque impossible de lire votre code mais je parierais que puisque les images sont liées aux JPanels et que vous ne disposez jamais des panneaux ou des images qui traînent et qui causent votre erreur. J'essaierais aussi de tout faire en ligne pour qu'au lieu de supprimer tout le panneau et de le remplacer par un nouveau, il suffit de supprimer l'image du panneau et de la remplacer par une nouvelle.

+0

Comment supprimer une image d'un panneau? –

+0

Tout ce que vous devez faire est d'ajouter une méthode setImage() au panneau. Lorsque vous réinitialisez l'image, les anciennes ressources doivent être libérées. – camickr

+0

désolé mais je ne sais pas comment j'irais faire une méthode setImage? Toute aide ou des liens vers quelque chose comme ça serait vraiment utile. Merci d'avance. –

Questions connexes