Java Appletの解説

<19.お絵かきソフト(その5)>

画像の一部を四角形に切り取り移動する機能とコピーする機能を追加します。

1.切り取り

18.「お絵かきソフト」を改善したものです。bmt5,bmt6をそれぞれ中塗多角、切り取りに機能 変えています。
1.<Javaファイル>
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−

import java.awt.image.*;
public class tpaint6 extends Applet{

int wcc1,hcc1,xcc1,ycc1;
ImageFilter cutfil;
Image cutimg;
public void init(){

p1.add(bmt5=new Button("中塗多角"));
p1.add(bmt6=new Button("切り取り"));

public void mousePressed(MouseEvent e){

if (chi==5){if (taka==0) {spx1=e.getX();spy1=e.getY();
spx2=e.getX();spy2=e.getY();xpl[0]=spx1;ypl[0]=spy1;}
else {spx1=spx2;spy1=spy2;}
if(chi==6){if(tadi==3){offg.clearRect(xcc1,ycc1,wcc1,hcc1);}}

public void mouseReleased(MouseEvent e){
if(chi==3){offg.fillRect(xx1,yy1,w1,h1);}
else if (chi==5){if (taka<9){offg.drawLine(spx1,spy1,spx2,spy2);taka=taka+1;xpl[taka]=spx2;ypl[taka]=spy2;}
else{chi=4;pmeth.setText("細線");}
if(chi==6){if (tadi==0){offg.drawRect(xx1,yy1,w1,h1);tadi=3;xcc1=xx1;ycc1=yy1;wcc1=w1;hcc1=h1;w1=0;h1=0;
cutfil=new CropImageFilter(xcc1,ycc1,wcc1,hcc1);
cutimg=createImage(new FilteredImageSource(offImage.getSource(),cutfil));
else if(tadi==3) {tadi=0;redra(tadi);}}
repaint();

public void mouseDragged(MouseEvent e){
if(chi==2){offg.clearRect(e.getX(),e.getY(),20,20);repaint();}
else if(chi==3){revwh(px2,py2);repaint();}
else if(chi==4){offg.drawLine(oldx,oldy,e.getX(),e.getY());oldx=e.getX();oldy=e.getY();repaint();}
else if(chi==5){spx2=e.getX();spy2=e.getY();repaint();}
else if(chi==6){if (tadi==3){w1=(px2-oldx);h1=(py2-oldy);repaint();}
else{revwh(px2,py2);repaint();}

class MyListener implements ActionListener{ public void actionPerformed(ActionEvent e){ if(e.getSource()==bmt1){offg.clearRect(0,0,getSize().width-1,getSize().height-1);repaint();tadi=0;taka=0;chi=1;pmeth.setText("全消去");} else if(e.getSource()==bmt2){plydisp(tadi);tadi=0;taka=0;chi=2;pmeth.setText("部分消去");} else if(e.getSource()==bmt3){plydisp(tadi);tadi=0;taka=0;chi=3;pmeth.setText("中塗四角");} else if(e.getSource()==bmt4){plydisp(tadi);tadi=0;taka=0;chi=4;pmeth.setText("細線");} else if(e.getSource()==bmt5){plydisp(tadi);tadi=2;taka=0;chi=5;pmeth.setText("中塗多角");} else if(e.getSource()==bmt6){plydisp(tadi);tadi=0;taka=0;chi=6;pmeth.setText("切り取り");} 略
void plydisp(int tadi){
if (tadi==2){offg.fillPolygon(xpl,ypl,taka+1);}
repaint();
} 略
public void update(Graphics g){
g.drawImage(offImage,0,0,this);
if (tadi==3){g.drawImage(cutimg,xcc1+w1,ycc1+h1,this);}
else{
if (chi==3){g.fillRect(xx1,yy1,w1,h1);}
if (chi==5){g.drawLine(spx1,spy1,spx2,spy2);}
if (chi==6){g.drawRect(xx1,yy1,w1,h1);} }
}
void redra(int tadi){
offg.drawImage(cutimg,xcc1+w1,ycc1+h1,this);}}
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
例1.ここをクリックして下さい。
2.<解説>
1)初期設定
1.int wcc1,hcc1,xcc1,ycc1;
(xcc1,ycc1)は、切り取られた四角形の(X,Y)座標,wcc1,hcc1は切り取られた四角形の幅,高さ
2.ImageFilter cutfil;Image cutimg;
ImageFilter cutfil;フィルターのようだが意味不明。Image cutimg;切り取った図を 取り込むイメージ。
2)マウスボタンが押された時の処理。public void mousePressed(MouseEvent e){
1.if(chi==6){if(tadi==3){offg.clearRect(xcc1,ycc1,wcc1,hcc1);}}
切り取りで、切り取った図を移動させようとしてマウスボタンが押された時、 切り取られた元の場所をクリアーする。
3)マウスボタンが放された時、public void mouseReleased(MouseEvent e){
1.if(chi==3){offg.fillRect(xx1,yy1,w1,h1);}
chi==3中塗四角の位置が決まってボタンが放された時、offg上に決まった四角形を描画する。
2.else if (chi==5){if (taka<9){offg.drawLine(spx1,spy1,spx2,spy2);
chi==5中塗多角でoffg上に決まった直線を描画する。
3.if(chi==6){if (tadi==0){offg.drawRect(xx1,yy1,w1,h1); tadi=3;xcc1=xx1;ycc1=yy1;wcc1=w1;hcc1=h1;w1=0;h1=0;
chi==6切り取りで、切り取る四角形が決まった時、offg上に決まった四角形を描画する.
cutfil=new CropImageFilter(xcc1,ycc1,wcc1,hcc1);
cutimg=createImage(new FilteredImageSource(offImage.getSource(),cutfil));
意味不明。切り取った画像をcutimgに格納する。
else if(tadi==3) {tadi=0;redra(tadi);}}
redra(tadi);を使って切り取った画像をoffg上の最終的な場所に表示する。
4)マウスドラッグ中の処理
1.else if(chi==6){if (tadi==3){w1=(px2-oldx);h1=(py2-oldy);repaint();}
切り取った画像をg上でX軸方向w1、Y軸方向h1移動させる。
2.else{revwh(px2,py2);repaint();}
切り取る四角形をrevwh(px2,py2);で新しい座標を求めてg上に描画する。
5)多角形の処理void plydisp(int tadi){
tadi==2は中塗多角形をoffg上に描画します。
6)描画public void update(Graphics g){
1.if (tadi==3){g.drawImage(cutimg,xcc1+w1,ycc1+h1,this);}
tadi==3は画像切り取り移動。g上に切り取った画像cutimgを描画する。
2.if (chi==6){g.drawRect(xx1,yy1,w1,h1);} }
切り取りのための四角形をg上表示する。
7)void redra(int tadi){
offg.drawImage(cutimg,xcc1+w1,ycc1+h1,this);}}
切り取った画像をoffg上の最終的に決まった場所に表示する。

2.コピー

コピーの場合,切り取りと違い切り取った場所はそのままにします。ほとんど同じですが 少しだけ違います。切り取りボタンをコピーに変えてます。
1.<Javaファイル>
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−

public class tpaint7 extends Applet{

public void init(){

p1.add(bmt6=new Button("コピー"));

public void mousePressed(MouseEvent e){

//**if(chi==6){if(tadi==3){offg.clearRect(xcc1,ycc1,wcc1,hcc1);}}
例1の上記は削除する。
public void mouseReleased(MouseEvent e){
if(chi==3){offg.fillRect(xx1,yy1,w1,h1);repaint();}
else if (chi==5){if (taka<9){offg.drawLine(spx1,spy1,spx2,spy2);taka=taka+1;xpl[taka]=spx2;ypl[taka]=spy2;}
else{chi=4;pmeth.setText("細線");}
repaint();}
if(chi==6){if (tadi==0){g.drawRect(xx1,yy1,w1,h1);tadi=3;xcc1=xx1;ycc1=yy1;wcc1=w1;hcc1=h1;w1=0;h1=0;
cutfil=new CropImageFilter(xcc1,ycc1,wcc1,hcc1);
cutimg=createImage(new FilteredImageSource(offImage.getSource(),cutfil));
else if(tadi==3) {tadi=0;redra(tadi);}}
//**repaint();
例1の上記は削除して移動する。

class MyListener implements ActionListener{ public void actionPerformed(ActionEvent e){ 略
else if(e.getSource()==bmt6){plydisp(tadi);tadi=0;taka=0;chi=6;pmeth.setText("コピー");} 略
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
例2.ここをクリックして下さい。
2.<解説>
1)マウスボタンが押された時の処理
if(chi==6){if(tadi==3){offg.clearRect(xcc1,ycc1,wcc1,hcc1);}}例1のこれを削除する。
切り取った場所をクリアーするためのもので、コピーの場合はクリアーせず、そのまま残すので これは削除する。
2)マウスボタンが放された時の処理
コピー範囲の枠を表示するため、最後にあったrepaint();を移動します。
1.if(chi==3){offg.fillRect(xx1,yy1,w1,h1);repaint();}
2.else{chi=4;pmeth.setText("細線");} repaint();}
3.if(chi==6){if (tadi==0){g.drawRect(xx1,yy1,w1,h1);tadi=3;xcc1=xx1;ycc1=yy1;wcc1=w1;hcc1=h1;w1=0;h1=0;
例1と違いoffg上でなくg上に枠を表示する。
4.repaint();例1の最後のこれは削除



トップページ

趣味のトップページ

娯楽室の各部屋
Aplletの解説へ戻る

Scriptの解説 Scriptのゲーム Appletのゲーム Linuxの部屋 物置部屋