2011年3月3日木曜日

JPanelの背景に画像を表示する方法(java1.4.2)

JPanelの背景に画像を表示する方法(java1.4.2)

調べてみると、Awtコンポーネントと異なりSwingコンポーネント描画処理は
1.paint()が呼び出される
2.いろいろなメソッドを呼び出す。(paintComponentというメソッドも呼ばれる。)
という構造になっている為、paint()メソッドはオーバライドしちゃだめだそうです。
※Awtはpaint()で何もやってないそうなのでpaint()をオーバーライドする。

というわけで、背景画像がらみの処理を行っているというpaintComponentというメソッドをオーバーライドしてGraphicsオブジェクトの設定を変更する処理を書きました。



が!


paintComponentが呼ばれないっ!


しょうがないので、paint()メソッドをいじってみることに。
そしたら、とりあえず背景画像は変わったけど、なぜかパネル上のテキストボックスとかがうまく描画されなくなってしまいました。タイムリミットも近付きあきらめかけたところ、最後の望みをかけて知人に相談してみることに。

ソースを見て「super.paintComponents(g);」をいい感じのところに移したところ、いきなりうまくいって背景画像の上にちゃんとテキストボックスが表示されるようになりました。

にしても、なんでうまくいったのかわからない…。
JLabelのpaintメソッド見てみたら、何も処理書いてなかったケド…
要調査(気が向いたら…)


<blockquote>
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;

public class ImageDocPanel extends JPanel{

    private BufferedImage IconImage = null;
    public BufferedImage getIconImage() {
        return IconImage;
    }
    public void setIconImage(BufferedImage iconImage) {
        IconImage = iconImage;
    }
  
    private boolean flgImageSet = false;
  
    public void paint(Graphics g) {
        // TODO 自動生成されたメソッド・スタブ
        super.paint(g);
      
        if (IconImage != null) {
            paintImage(g);
        }

        super.paintComponents(g);←ここに移動

    }
    public void paintImage(Graphics g) {
      
//        Graphics2D g2D = (Graphics2D) g.create();
        Graphics2D g2D = (Graphics2D) g;

        double imageWidth = IconImage.getWidth();
        double imageHeight = IconImage.getHeight();
        double panelWidth = this.getWidth();
        double panelHeight = this.getHeight();

        // 画像がコンポーネントの何倍の大きさか計算
        double sx = (panelWidth / imageWidth);
        double sy = (panelHeight / imageHeight);

        // スケーリング
        AffineTransform af = AffineTransform.getScaleInstance(sx, sy);
        g2D.drawImage(IconImage, af, this);
//        g2D.dispose();
      
super.paintComponents(g);←これを消して

        flgImageSet = true;
    }

}
</blockquote>

0 件のコメント:

コメントを投稿