2009-08-04 12 views
0

ボタンをクリックすると、画像を画面上の画像に合わせて更新するよりもJavaプログラムがあります。これは最初の15回かそれ以降のクリックで機能し、Javaのヒープスペースエラーを引き起こします。私はそれがバッファリングされたイメージを含むjpanelを更新しているが、その理由がわからないためだと思う。 JPanelのは、新しいイメージが、java guiが画像を変更するとヒープスペースエラーが発生する

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

}

ですそして、私のGUIを更新するコードは、それがそのcontaingパネルからパネルを取り外すと、それにそれをreaddingすることによって動作し、ある含有させる得るために、私のコード。

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

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

また、コードの後半部分に含まれているパネルを更新するコードを書式設定できますか? – extraneon

答えて

0

jvisualvm(Java 6 JDK)を添付して、メモリがどこにあるかを確認してください。

0

あなたのコードを読むことはほとんど不可能ですが、画像がJPanelsに結び付けられているので、それらがぶら下がっている画像やパネルを適切に処分することができず、エラーが発生します。また、パネル全体を削除して新しいパネルに置き換えるのではなく、パネルから画像を削除して新しいパネルに置き換えるだけで、インラインですべての処理を実行しようとします。

+0

パネルから画像を削除するにはどうすればよいですか? –

+0

パネルにsetImage()メソッドを追加するだけです。イメージをリセットすると、古いリソースが解放されます。 – camickr

+0

申し訳ありませんが、私はsetImageメソッドをどうやってやるのか考えていませんか?そのようなものへの助けやリンクは本当に役に立ちます。前もって感謝します。 –

関連する問題