色々な曲線を描いてみる

色々な曲線を描いてみる その2

 色々な曲線を切り替えて表示できるようにしたいと思います。そのために、切り替えられるボタンを表示したいと思います。
今はDrawGraphiの中のswitch (num)で切り替えられるようになっています。このnumの数値を変更すると曲線の画面表示も変更できます。
どうやって切り替えるかは、画面にボタンを作って表示させてみたいと思います。
コントロールパネルを作って、その中にボタンを配置してもいいのですが、ボタンの絵を描いて、そのボタンをクリックしたかを判定して表示を切り替えたいと思います。
DrawGraphiのなかに、drawButtonというメソッドを追加して、アニメチックなボタンを描いています。
最初の、if(fCrick)は、ボタンの上でクリックしたかを判定して、クリックしていたら、up、DWNに応じて、曲線の番号numを変更しています。
この後の処理は、ボタンのお絵かきです。ベジエや角丸□でボタンを作っていますが、センスがないので、イマイチです。


	void drawButton(Graphics g){
		Graphics2D g2 = (Graphics2D)g;
		if(fCrick){
			setCrick(false);
			int hant=getHantei();
			if(hant!=0){
				num+=hant;
				if(num<0){num=numMax;}else if(num>numMax){num=0;}
			}
		}

		g2.setColor(Color.PINK);
		g2.setFont(panelFont);
		g2.fill(new RoundRectangle2D.Double((double)(rect[0]),(double)(rect[1]),rectW,rectW,10.0d,10.0d));
		//x座標, y座標, 幅, 高さ, 弧の幅, 弧の高さ
		g2.setStroke(normalStroke);
		g2.setColor(Color.CYAN);
		g2.fill(new QuadCurve2D.Double(rect[0]+2.0d,rect[1]+rectW/2-3.0d, rect[0]+rectW/2, rect[1]-rectW/2+4.0d, rect[0]+rectW-2, rect[1]+rectW/2-3.0d));
		//始点x、	始点y,					制御点x,		制御点y,				終点y,終点y
		g2.fill(new QuadCurve2D.Double(rect[0]+2.0d,rect[1]+rectW/2+4.0d, rect[0]+rectW/2, rect[1]+rectW*1.5-4.0d, rect[0]+rectW-2, rect[1]+rectW/2+4.0d));
		g2.draw(new Line2D.Double(rect[0],rect[1]+rectW/2, rect[0]+rectW,rect[1]+rectW/2));
		g2.setColor(Color.BLUE);
		g2.draw(new RoundRectangle2D.Double(rect[0],rect[1],rectW,rectW,10.0d,10.0d));
		String alt = Integer.toString(num);
		double w=0.0d;
		if(num<10){	w=fontSize/1.4;}else{w=fontSize/2/1.4;}
		g2.drawString(alt,(int)(rect[0]+w),(int)(rect[1]+fontSize*1.4));
	}

 次に数字のアップダウンです。上をクリックすると数字がアップして、下をクリックすると数字がダウンするようにします。
GFrameのなかに次のようにマウスクリックのアクションを追加しています。
ワンクリックすると、フラグをtrueにして、クリック位置をDrawGraphiへ渡しています。

 


		jScrollPane1.addMouseListener(new java.awt.event.MouseAdapter() {
			public void mouseClicked(MouseEvent e) {
				jScrollPane1_mouseClicked(e);
			}
		});

	private void jScrollPane1_mouseClicked(MouseEvent e) {
		if ( e.getClickCount() ==1 ) {
			flgCrick=DGr.getCrick();
			if(!flgCrick){
				flgCrick=true;
				crx0=((Viewp.getp_x( )+e.getX()));
				cry0=((Viewp.getp_y( )+e.getY()));
				DGr.setCrick_Pos(crx0,cry0);
				DGr.setCrick(flgCrick);
			}
		}
	}


 

 このマウスクリックの位置がボタンの上なのかを判定して、アップダウンします。
 最初のdrawButton()のなかの、hant=getHantei();で判定しています。
getHantei()は次のようになっていて、四角のなかにクリックが含まれている(contains)かで判定しています。
こんな便利な文法があるとは知りませんでした。四角の内外判定を作らないといけないと思ってました。外にも知らない便利な文法がたくさんあるに違いないです。
 ところで、動作させてみると、ボタンの反応が悪い、クリックしても切り替わらないと感じると思います。これは、リペイント毎に、drawButtonのなかでGFrameでクリックしたかを問い合わせるように処理すればタイムリーに切り替わるんだと思うのですが、今はGFrameでクリックしたら、クリックしたのをDrawGraphiへセットする処理になっています。反応が悪いのはそのためなのかなと思っています。  

 


	private int getHantei() {
		int def=0;
		Rectangle rectAngUp=new Rectangle((int)(rect[0]+1),(int)(rect[1]+1),rectW-2,rectW/2-2);
		Rectangle rectAngDwn=new Rectangle((int)(rect[0]+1),(int)(rect[1]+rectW/2+1),rectW-2,rectW/2-2);
		if( rectAngUp.contains(crx,cry)){def=1;	}
		if( rectAngDwn.contains(crx,cry)){def=-1;}
		return def;
	}

 



実行すると、右図のようになります。
ボタンの上や下をクリックしたら、数字が変わって、曲線も変わったでしょうか。
曲線の種類も増やしました。







今回のプログラムで、変更したファイルを添付しておきましょう。