フレームとともに図の大きさを変える

BufferedImageを使っていれば

BufferedImageを使っていれば,paintComponentでコピー(drawImage)するときに 拡大縮小できますから,とても簡単です。

paintComponentでwidthとheightを求めて,その大きさを指定してdrawImageします。

ファイル名 EventRandom3.java の一部

public void paintComponent(Graphics myg){
    //super.paintComponent(myg);
    pcct++;
    //myg.drawImage(buffimg, 0, 0, this);
    myg.drawImage(buffimg, 0, 0,getSize().width, getSize().height, this);
}

フレームを拡大すると画像も拡大されます。

EventRandom

ただし、縦横比は変化してしまいます。

EventRandom

拡大する代わりにセンタリング

拡大する代わりに画像の大きさはそのままにセンタリングしてみます。

JPanel(を継承したクラス)のインスタンスの幅は getSize().width で、BufferedImageのインスタンスの幅は getwidth() で得ることができます。その差が余白になりますから、その半分の位置から始めれば真ん中になります。高さについても同様。

ファイル名 EventRandom4.java の一部

      public void paintComponent(Graphics myg){
         pcct++;
         myg.drawImage(buffimg, 
              ( getSize().width  - buffimg.getWidth()  )/2,
              ( getSize().height - buffimg.getHeight() )/2, this);
      }

EventRandom

パネルが画像より小さくてもセンタリングされます。

EventRandom

EventRandom

縦横比を変えないで拡大(1)

横幅はパネルに合わせ、縦幅を同じ拡大率にします。余ったらはみ出します。

ファイル名 EventRandom5.java の一部

      public void paintComponent(Graphics myg){
         pcct++;
         int pnlw = getSize().width;
         int imgh = buffimg.getHeight() * pnlw / buffimg.getWidth();
         myg.drawImage(buffimg, 0, 0, pnlw, imgh, this);
      }

課題

上記プログラムをつくって動作を確認しなさい。

ファイル名 EventRandom3.java

ファイル名 EventRandom4.java

ファイル名 EventRandom5.java

余計な話

縦横比を変えないで拡大(2)

決してはみ出さず常に全体が見えるようにする縦横比が固定の拡大。

      public void paintComponent(Graphics myg){
         int pnlw = getSize().width;
         int pnlh = getSize().height;
         int imgw = buffimg.getWidth();
         int imgh = buffimg.getHeight() ;
         int h,w;
         if ( (double)pnlw/pnlh > (double)imgw/imgh ) {
             h = pnlh; w = imgw * pnlh / imgh;
         }
         else{
             w = pnlw; h = imgh * pnlw / imgw;
         }
         pcct++;
         myg.drawImage(buffimg, 
              ( getSize().width  - w )/2,
              ( getSize().height - h )/2,
              w, h, this);
      }
もくじ

Javaプログラミング
聖愛中学高等学校
http://www.seiai.ed.jp/
Dec.2003
Oct.2010
Oct.2012