2012-03-20 15 views
0

JPanelで画像を表示しようとしています。私はswingxライブラリ - ImagePainterを使っています。そこで、ImagePainterに設定された背景ペインタでJXPanelを作成します。JPanelスイングで画像を表示しているときにメモリが不足しています

ここでは、2つの別々のJFramesにある2つのJPanelで同じイメージを表示する必要があります。私がそれをすると、ヒープスペースの問題が発生します。この場合、ImagePainterの同じインスタンスを共有しますか?助けてくれますか?しかし、それは、もし私が複数のユニークなイメージを表示する必要があれば、私は何とかメモリ不足のエラーが発生することを意味します。

私が使用するコードは以下の通りです:

public static ImagePainter getImagePainter(String imageLocation) { 
    ImagePainter imgPainter=null; 
    try { 
     imgPainter = new ImagePainter(ImageIO.read(new File(imageLocation))); 
    } catch (IOException e) { 
     throw new SwingObjectRunException(e, ErrorSeverity.SEVERE, CommonUI.class); 
    } 
    return imgPainter; 
} 

エラースタックトレースは以下の通りです:

Caused by: java.lang.OutOfMemoryError: Java heap space 
    at java.awt.image.DataBufferByte.<init>(DataBufferByte.java:59) 
    at java.awt.image.ComponentSampleModel.createDataBuffer(ComponentSampleModel.java:397) 
    at java.awt.image.Raster.createWritableRaster(Raster.java:938) 
    at javax.imageio.ImageTypeSpecifier.createBufferedImage(ImageTypeSpecifier.java:1056) 
    at javax.imageio.ImageReader.getDestination(ImageReader.java:2879) 
    at com.sun.imageio.plugins.jpeg.JPEGImageReader.readInternal(JPEGImageReader.java:980) 
    at com.sun.imageio.plugins.jpeg.JPEGImageReader.read(JPEGImageReader.java:948) 
    at javax.imageio.ImageIO.read(ImageIO.java:1422) 
    at javax.imageio.ImageIO.read(ImageIO.java:1282) 

更新: あなたはなJGoodiesが必要になります。ここでは、問題を示してSSCCEですこれをコンパイルするには、クラスパス上にlayout jarとswingx jarを作成します。画像をもう一度2回クリックすると、私にはメモリ不足エラーが発生します。私が使用した画像も添付されています。

Image to use

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.io.File; 
import java.io.IOException; 

import javax.imageio.ImageIO; 
import javax.swing.JButton; 
import javax.swing.JDialog; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

import org.jdesktop.swingx.JXPanel; 
import org.jdesktop.swingx.painter.ImagePainter; 

import com.jgoodies.forms.layout.CellConstraints; 
import com.jgoodies.forms.layout.FormLayout; 


public class Photo { 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     try{ 
      JFrame frame=new JFrame(); 
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      JPanel panel=new JPanel(); 
      panel.setLayout(new FormLayout("5dlu,fill:250px,15dlu", "5dlu,fill:150px,15dlu,fill:pref,5dlu")); 

      panel.add(getImagePanel(), new CellConstraints(2, 2)); 

      JButton btnOpenDiag=new JButton("Open Image Again"); 
      panel.add(btnOpenDiag,new CellConstraints(2, 4, 1, 1, CellConstraints.CENTER, CellConstraints.FILL)); 

      btnOpenDiag.addActionListener(new ActionListener() { 
       @Override 
       public void actionPerformed(ActionEvent e) { 
        try { 
         JDialog dialog=new JDialog(); 
         JPanel panel=new JPanel(); 
         panel.setLayout(new FormLayout("5dlu,fill:250px,15dlu", "5dlu,fill:150px,5dlu")); 
         panel.add(Photo.getImagePanel(), new CellConstraints(2, 2)); 
         dialog.setContentPane(panel); 
         dialog.pack(); 
         dialog.setVisible(true); 
        } catch (IOException e1) { 
         e1.printStackTrace(); 
        } 
       } 
      }); 

      frame.setContentPane(panel); 
      frame.pack(); 
      frame.setVisible(true); 
     }catch(Exception e){ 

     } 


    } 

    protected static JXPanel getImagePanel() throws IOException { 
     JXPanel imgPanel=new JXPanel(); 
     ImagePainter painter=new ImagePainter(ImageIO.read(new File(Photo.class.getResource("image.jpg").getFile()))); 
     painter.setFillHorizontal(true); 
     painter.setFillVertical(true); 
     imgPanel.setBackgroundPainter(painter); 
     return imgPanel; 
    } 

} 
+0

ピクセル単位とビット深度の画像の大きさはどれくらいですか? * 2つの別々のJFrames *アプリケーションは一般的に[1つのフレーム](http://stackoverflow.com/a/9554657/418556)のみを持つべきです。 –

+0

imageLocationのファイルのサイズはどれくらいですか?小さいファイルを指しているとどうなりますか? –

+0

ループ内でgetImagePainter()を呼び出していないと確信していますか? –

答えて

0

あなただけの十分なメモリを持っていません。どのくらいのメモリイメージを取得するかは、その解像度に依存します。

画像はおそらく巨大であるか、一度に2つ以上の画像があります。

次は、Javaプロセスのメモリ(xmx)を増やすことができると思います。

関連する問題