2009-08-04 9 views
0

Ich habe ein Java-Programm, als wenn eine Schaltfläche angeklickt wird aktualisiert es das Bild auf dem Bildschirm auf das entsprechende Bild. Dies wird für die ersten 15 Klicks funktionieren, dann verursacht es einen Java-Heapspace-Fehler. Ich denke, es ist wegen der Art, wie ich das jpanel aktualisiere, das das gepufferte Bild enthält, aber nicht sicher, was der Grund ist. Mein Code erhalten die JPanel machen enthalten das neue Bild ist,java gui Bildwechsel verursacht heapspace Fehler

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; 
} 

}

Und der Code, der meine gui aktualisiert ist, funktioniert es durch die Platte von seiner containg Abdeckung entfernen und readding es dann, um es .

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

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

Können Sie auch den letzten Teil Ihres Codes codieren, in dem Sie das enthaltene Panel aktualisieren? – extraneon

Antwort

0

Verbinden Sie mit jvisvisualvm (in der Java 6 JDK) und sehen Sie, wohin Ihr Speicher geht.

0

Es ist fast unmöglich, Ihren Code zu lesen, aber ich würde wetten, da die Bilder in die JPanels gebunden sind und Sie nie richtig die Paneele oder Bilder beseitigen, die sie herumhängen und das Ihren Fehler verursacht. Ich würde auch versuchen, alles inline zu machen, anstatt das ganze Panel zu entfernen und es durch ein neues zu ersetzen, löschst du einfach das Bild aus dem Panel und ersetzst das durch ein neues.

+0

Wie würde ich ein Bild von einem Panel löschen? –

+0

Sie müssen lediglich eine setImage() -Methode zum Panel hinzufügen. Wenn Sie das Image zurücksetzen, sollten die alten Ressourcen freigegeben werden. – camickr

+0

Entschuldigung, aber ich habe keine Ahnung, wie ich eine setImage-Methode machen würde? Jede Hilfe oder Links zu etwas wie es wäre wirklich hilfreich. Danke im Voraus. –