0

JPanelで画像を表示しようとしています。これには、swingx ライブラリの ImagePainter を使用しています。そこで、背景ペインターを ImagePainter に設定して JXPanel を作成します。

ここで、2 つの別個の JFrame にある 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)

更新: 問題を示す SSCCE は次のとおり です。これをコンパイルするには、クラスパスに jgoodies フォーム レイアウト 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;
    }

}
4

1 に答える 1

0

十分なメモリがありません。取得するメモリイメージの量は、その解像度によって異なります。

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

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

于 2012-03-20T11:20:42.023 に答える