BufferedImageを使っていれば,paintComponentでコピー(drawImage)するときに 拡大縮小できますから,とても簡単です。
paintComponentでwidthとheightを求めて,その大きさを指定してdrawImageします。
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); }
フレームを拡大すると画像も拡大されます。
ただし、縦横比は変化してしまいます。
拡大する代わりに画像の大きさはそのままにセンタリングしてみます。
JPanel(を継承したクラス)のインスタンスの幅は getSize().width で、BufferedImageのインスタンスの幅は getwidth() で得ることができます。その差が余白になりますから、その半分の位置から始めれば真ん中になります。高さについても同様。
public void paintComponent(Graphics myg){ pcct++; myg.drawImage(buffimg, ( getSize().width - buffimg.getWidth() )/2, ( getSize().height - buffimg.getHeight() )/2, this); }
パネルが画像より小さくてもセンタリングされます。
横幅はパネルに合わせ、縦幅を同じ拡大率にします。余ったらはみ出します。
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); }
上記プログラムをつくって動作を確認しなさい。
決してはみ出さず常に全体が見えるようにする縦横比が固定の拡大。
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); }