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回クリックすると、私にはメモリ不足エラーが発生します。私が使用した画像も添付されています。
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;
}
}
ピクセル単位とビット深度の画像の大きさはどれくらいですか? * 2つの別々のJFrames *アプリケーションは一般的に[1つのフレーム](http://stackoverflow.com/a/9554657/418556)のみを持つべきです。 –
imageLocationのファイルのサイズはどれくらいですか?小さいファイルを指しているとどうなりますか? –
ループ内でgetImagePainter()を呼び出していないと確信していますか? –