コンポーネットへ描画する場合は、
描画対象や、描画ツールを管理する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();//再描画の指示 }
上記を確認後、このボタンをクリックください。→