Graphics2の透過や移動描画

コンポーネットへ描画する場合は、 描画対象や、描画ツールを管理するGraphicsクラスを使いますが、 Swingが登場したJava Var 1.2の時に、Graphicsクラスを強化した「Graphics2D」が用意されました。
そして、過去の命令の互換性を保ちつつ、評価した「Graphics2D」が使えるように 次の継承関係にして、内部で使うオブジェクトは「Graphics2D」に変更されました。
これにより、登場前からあるメソッドで使われる型はGraphicsのままで、 以前と同じように使えます。
しかも参照しているオブジェクトは「Graphics2D」になっているので、 強化された「Graphics2D」の機能を使う場合は(Graphics2D)にキャストして 使うことができます。

java.lang.Object
 └java.awt.Graphics
  └java.awt.Graphics2D

Graphics2Dを使うことで、階調をつけた塗りつぶしや、幅指定の線描画が 可能になります。以下で、 ダイアログの楕円描画部(drawOvalメソッド)を以下で変更して確認できます。
グラデーション塗りつぶし 、5.0の幅のを線描画
(なお、JDK1.6からRadialGradientPaint円形の階調も可能になっています。)

	public void drawOval(Color color){
		this.setTitle(""/*Integer.toHexString(color.getRGB())*/);//色の16進数値へ変換し、タイトル設定
		Graphics g = (Graphics2D)bufImg.getGraphics();
		Ellipse2D shape = new Ellipse2D.Double(0, 0, imgSize.width, imgSize.height);
		GradientPaint paint = new GradientPaint(
			0, 0, new Color(255, 255, 255, 0), //始点位置と色(左端のは不透明度合い)
			imgSize.width, 0, color, false);//終点位置と色で、変化を繰り返す
		
		

		Ellipse2D shape = new Ellipse2D.Double(0, 0, imgSize.width, imgSize.height);
		BasicStroke stroke = new BasicStroke(5.0f);//線幅を5.0
		g2.setStroke(stroke);//線描画設定
		g2.setPaint(Color.BLACK);//塗りつぶしの情報設定
		g2.draw(shape);//線を描く(輪郭)
		this.paintPanel.brushImg = bufImg;//PaintPanelのブラシを変更
		this.repaint();
	}

Graphics2Dを使う恩恵は、この他にもさまざまあります。
ここでは、透過描画と移動描画を取り上げます。

透過描画では、AlphaCompositeクラスのオブジェクトを、 Graphics2DにsetCompositeにsetCompositeメソッドで設定して使います。 AlphaCompositeオブジェクトは、描画における合成規則や不透明度合いをパラメタにして getInstanceのstaticメソッドで取得して使います。 下記では、初期の合成規則をSRC_OVER、 不透明度合いを0.5Fにしています。変更して実験してみましょう

また移動描画では、AffineTransformクラスのオブジェクトを用います。
移動の設定を施したAffineTransformオブジェクトを引数にして、 Graphics2DのdrawImageメソッドで描画する形です。 (ここでは行っていませんが、AffineTransformオブジェクトには、回転、拡大などの設定も可能です。)
これらクラスの詳細は次のリンクで調べましょう。


適当なブラシを表示させ、各実験で確認ください。


PaintPanelクラスに次のインスタンス変数を追加します。 (alphaは不透明の度合い設定値で0が完全に透明で、1.0が完全に不透明のブラシとなります。)

そして、パネルへの描画(メモリイメージの描画の設定) する部分を以下のように変更して実験します。

	public void drawWith(MouseEvent e){
		Point p = e.getPoint();//ドラックした所の座標取得
		Graphics2D g2 = (Graphics2D)this.offscrImg.getGraphics();//描画ツール取得
		AlphaComposite omposite;//イメージを合成(composite)する指定を行うクラス
		omposite = AlphaComposite.getInstance(AlphaComposite., alpha);
		g2.setComposite(omposite);//合成情報を設定
		
		
		
		g2.drawImage(
		this.repaint();//再描画の指示
	}

上記を確認後、このボタンをクリックください。→