2

ここで以前のトピックの1つを使用して、独自のImagePanelを作成しました。

import java.awt.Graphics;
import java.awt.image.BufferedImage;
import javax.swing.JPanel;

public class ImagePanel extends JPanel{

    private BufferedImage image = null;

    public ImagePanel(BufferedImage im) {
       image = im;
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawImage(image, 0, 0, null);            
    }
}

そして、このパネルを通常のJPanelに追加するとよいと思いました(このすべてのNetBeansのものを使用してフレームに配置する方が簡単です)。そこで、1つ追加しました。NetBeansによってコードが生成されまし private javax.swing.JPanel pnlImagePanel; た。画像を表示したい瞬間が来たので、次のようにします。

File selectedFile = new File(path);
try {
       image = ImageIO.read(selectedFile);
} catch(IOException ex) {
       throw new RuntimeException(ex);
}
ImagePanel imPanel = new ImagePanel(image);
this.pnlImagePanel = imPanel;
this.pnlImagePanel.repaint();

問題は明らかです-結果は得られませんでした。うまくいかないの?メソッドpaintComponentをオーバーライドしたので、ポリモーフィズムが発生するはずです。それとも私には何かが欠けていますか?

4

3 に答える 3

6

pnlImagePanelにメンバー変数を割り当てるだけImagePanelでは機能しません。パネルをコンテナに追加する必要があります。JPanel

pnlImagePanel.add(imPanel);

imPanel画像が見えるようにサイズを指定する必要があります。最も簡単なアプローチは、子パネルが最大領域を占めることを可能にするレイアウトマネージャーを使用することです。デフォルトではなくFlowLayout、次を使用できますGridLayout

pnlImagePanel.setLayout(new GridLayout());

ここでは呼び出すrepaint必要はありません。ペイントチェーンメカ​​ニズムにより、パネルが確実にペイントされます。

于 2013-03-10T16:34:02.657 に答える
2

オーバーライドgetPrefferedSize()ImagePanelて画像サイズを返します。例:

    @Override
    public Dimension getPreferredSize() {
        if (image == null) {
            return super.getPreferredSize();
        }
        return new Dimension(image.getWidth(this), image.getHeight(this));
    }

そして、はい、@Reimeusによって提案されたように画像パネルをコンテナに追加することを忘れないでください。彼に+1。

于 2013-03-10T16:34:22.280 に答える
1
import java.awt.BorderLayout;
import java.awt.Graphics;
import javax.swing.ImageIcon;

/**
 * imagePanel
 * @author zhangqi hizhangqi@yahoo.com
 * @date Jan 10, 2013 4:45:05 PM
 * @version V1.0
 */
public class ImagePanel extends JPanel
{

    private static final long serialVersionUID = 1L;
    private BorderLayout borderLayout = new BorderLayout();
    private ImageIcon image = null;

    public ImagePanel(ImageIcon image)
    {
        this.image = image;
        this.setLayout(borderLayout);
    }

    protected void paintComponent(Graphics g)
    {
        setOpaque(true);
        super.paintComponent(g);
        if (image != null)
            g.drawImage(image.getImage(), 0, 0, this.getWidth(),
                    this.getHeight(), this);
    }

    public ImageIcon getImage()
    {
        return image;
    }

    public void setImage(ImageIcon image)
    {
        this.image = image;
    }
}
于 2013-03-11T01:47:19.943 に答える