|
|
Graphics2D クラスの使用事例 |
H.Kamifuji . |
Java2D で、2次元のグラフィック処理を行う上で基本となる Graphics2D クラスについて、事例にて説明します。 現在(2021/08)では、JDK-16.0.2 にアップされています。一部、上位互換について、見直しを行っていきます。 現在(2021/11)では、JDK-17.0.1 にアップされています。一部、上位互換について、見直しを行っていきます。 現在(2023/04)では、JDK-20.0.1 にアップされています。一部、上位互換について、見直しを行っていきます。 現在(2024/10)では、JDK-23 にアップされています。一部、上位互換について、見直しを行っていきます。 |
|
Swing を使って描画処理には、「paintComponent」メソッドを書き換えることで実現します。「paintComponent」メソッドは、JComponent クラスで定義されていて、コンポーネントの描画が必要になった時に内部的に呼び出されるメソッドです。public void paintComponent(Graphics g){ }これ以降のサンプルでは、JPanel を継承したクラスを作成して利用します。 色々な図形を描画したり、文字を描画するには、「paintComponent」メソッドの引数で渡される「Graphics」クラスのオブジェクトに対して行います。 下記のサンプルを実行してみよう。 /** * GraphicsクラスとpaintComponentメソッド */ import javax.swing.*; import java.awt.Graphics; import java.awt.Color; public class Graphics2DTest1 extends JPanel { public static void main(String[] args) { JFrame frame = new JFrame(); Graphics2DTest1 app = new Graphics2DTest1(); frame.getContentPane().add(app); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setBounds(10, 10, 300, 200); frame.setTitle("タイトル"); frame.setVisible(true); } public void paintComponent(Graphics g) { g.setColor(Color.red); g.fillRect(40, 20, 200, 120); g.setColor(Color.blue); g.drawString("Hello Java2D", 10, 50); } }上記をコンパイルして、実行すると下記のように表示されます。 ![]() |
Graphics2Dクラスのクラス図は、次のようになっています。java.lang.Object ⇒ java.awt.Graphics ⇒ java.awt.Graphics2D public abstract class Graphics2D extends GraphicsGraphics2Dクラスは、abstract クラスのため直接コンストラクタを使ってオブジェクトを作成できません。「paintComponent」メソッドの引数として渡されている Graphics クラスのオブジェクトを Graphics2D クラスのオブジェクトにキャストして利用します。 public void paintComponent(Graphics g){ Graphics2D g2 = (Graphics2D)g; }下記のサンプルを実行してみよう。 /** * Graphics2Dクラス */ import javax.swing.*; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.geom.*; public class Graphics2DTest2 extends JPanel{ public static void main(String[] args){ JFrame frame = new JFrame(); Graphics2DTest2 app = new Graphics2DTest2(); frame.getContentPane().add(app); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setBounds(10, 10, 300, 200); frame.setTitle("タイトル"); frame.setVisible(true); } public void paintComponent(Graphics g){ Graphics2D g2 = (Graphics2D)g; g2.draw(new Line2D.Double(20, 20, 160, 140)); } }上記をコンパイルして、実行すると下記のように表示されます。 ![]() |
Graphics2Dクラスでは描画方式についていくつかの設定項目が用意されています。描画の時に品質を優先するかスピードを優先するかなどです。ここでは設定項目の1つであるアンチエイリアス処理の設定について確認していきます。 アンチエイリアス処理とは線や図形を表示する時にギザギザに見えてしまう部分を滑らかな感じにしてくれるものです。 アンチエイリアス処理を有効にするにはGraphics2Dクラスで用意されている「setRenderingHint」メソッドを使います。 setRenderingHint public abstract void setRenderingHint(RenderingHints.Key hintKey, Object hintValue)描画アルゴリズムの推奨設定の値を 1 つ設定します。Hint カテゴリには、描画品質を制御することと、描画プロセスでの描画速度と描画品質との全体的な妥協点を制御することが含まれます。RenderingHints クラスで、共通のキーと値の定義の一部を参照できます。 パラメータ: hintKey - 設定されるヒントのキー hintValue - 指定されたヒントカテゴリの推奨設定を 示す値 「setRenderingHint」メソッドでは設定対象となる項目と設定内容をペアで指定します。設定可能な項目はjava.awt.RenderingHintsクラスで定義されており次の値の中から指定します。
図形の描画に対してアンチエイリアスの設定を行うには「RenderingHints.Key.KEY_ANTIALIASING」に対して値を設定します。設定可能な値は次の通りです。
具体的には次のように記述します。 public void paintComponent(Graphics g) { Graphics2D g2 = (Graphics2D)g; g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); }上記のコードを記述することで、アンチエイリアス処理が有効になります。 下記のサンプルを実行してみよう。 /** * アンチエイリアス処理 */ import javax.swing.*; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.geom.*; import java.awt.RenderingHints; public class Graphics2DTest3 extends JPanel{ public static void main(String[] args){ JFrame frame = new JFrame(); Graphics2DTest3 app = new Graphics2DTest3(); frame.getContentPane().add(app); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setBounds(10, 10, 300, 200); frame.setTitle("タイトル"); frame.setVisible(true); } public void paintComponent(Graphics g){ Graphics2D g2 = (Graphics2D)g; g2.draw(new Line2D.Double(20, 20, 110, 140)); g2.draw(new Arc2D.Double(70, 60, 100, 100, 90, 135, Arc2D.CHORD)); g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2.draw(new Line2D.Double(150, 20, 240, 140)); g2.draw(new Arc2D.Double(200, 60, 100, 100, 90, 135, Arc2D.CHORD)); } }上記をコンパイルして、実行すると下記のように表示されます。 ![]() |
Graphics2Dクラスで用意されている「setRenderingHint」メソッドを使うことで図形の描画に対するアンチエイリアス処理の設定が行えることは上記で確認しました。 図形の描画の場合は「RenderingHints.Key.KEY_ANTIALIASING」に対して値を設定しましたが文字列の描画に対するアンチエイリアス処理は「RenderingHints.Key.KEY_TEXT_ANTIALIASING」に対して値を設定します。設定可能な値は次の通りです。
またJ2SE6.0から次の設定項目も選択できるようになりました。
具体的には次のように記述します。 public void paintComponent(Graphics g){ Graphics2D g2 = (Graphics2D)g; g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); }上記の設定を行うことで文字列の描画に対するアンチエイリアス処理が有効となります。 下記のサンプルを実行してみよう。 /** * 文字描画に対するアンチエイリアス処理 */ import javax.swing.*; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.geom.*; import java.awt.RenderingHints; import java.awt.Font; public class Graphics2DTest4 extends JPanel{ public static void main(String[] args){ JFrame frame = new JFrame(); Graphics2DTest4 app = new Graphics2DTest4(); frame.getContentPane().add(app); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setBounds(10, 10, 300, 200); frame.setTitle("タイトル"); frame.setVisible(true); } public void paintComponent(Graphics g){ Graphics2D g2 = (Graphics2D)g; Font font = new Font("Arial", Font.PLAIN, 24); g2.setFont(font); g2.drawString("AntiAlias", 10, 30); g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); g2.drawString("AntiAlias", 140, 30); g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HRGB); g2.drawString("AntiAlias", 140, 60); g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HBGR); g2.drawString("AntiAlias", 140, 90); g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_VRGB); g2.drawString("AntiAlias", 140, 120); g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_VBGR); g2.drawString("AntiAlias", 140, 150); } }上記をコンパイルして、実行すると下記のように表示されます。 ![]() |
図形の描画方法を確認する前に領域の背景を指定の色でクリアする方法を確認していきます。背景をクリアするには Graphics2D クラスの親クラスである Graphics クラスで用意されている「clearRect」メソッドを使います。clearRect public abstract void clearRect(int x, int y, int width, int height)指定された矩形を、現在の描画表面のバックグラウンドカラーで塗りつぶすことによりクリアします。この操作は、現在のペイントモードを使いません。 Java 1.1 以降は、オフスクリーンのイメージのバックグラウンドカラーはシステムにより異なります。アプリケーションは setColor に続けて fillRect を使うことによって、オフスクリーンイメージをクリアして特定の色にすることを保証します。 パラメータ: x - クリア対象の矩形の x 座標 y - クリア対象の矩形の y 座標 width - クリア対象の矩形の幅 height - クリア対象の矩形の高さ 1番目から4番目までの引数を使って(x, y)-(x + width, y + height)の領域を指定のバックグラウンドカラーで塗りつぶします。 領域全体をクリアするには幅及び高さについて描画対象のコンポーネントの大きさを取得する必要があります。JComponentクラスで用意されている「getWidth」メソッドと「getHeight」メソッドを使います。 getWidth: getWidth public int getWidth()このコンポーネントの現在の幅を返します。このメソッドは、ヒープの割り当てが発生しないので、component.getBounds().width または component.getSize().width よりも適切です。 戻り値: このコンポーネントの現在の幅 getHeight: getHeight public int getHeight()このコンポーネントの現在の高さを返します。このメソッドは、ヒープの割り当てが発生しないので、component.getBounds().height または component.getSize().height よりも適切です。 戻り値: このコンポーネントの現在の高さ 具体的には次のように記述します。 public void paintComponent(Graphics g) { Graphics2D g2 = (Graphics2D)g; g2.clearRect(0, 0, getWidth(), getHeight()); } 背景色の指定 塗りつぶす色を指定するにはGraphics2Dクラスで用意されている「setBackground」メソッドを使います。 setBackground public abstract void setBackground(Color color)Graphics2D コンテキストのバックグラウンドカラーを設定します。バックグラウンドカラーは、領域をクリアするために使われます。Graphics2D を Component 用に作成すると、バックグラウンドカラーが Component から継承されます。Graphics2D コンテキストでのバックグラウンドカラーを設定しても、それ以降の clearRect() 呼び出しに作用するだけで、Component のバックグラウンドカラーには影響を及ぼしません。Component のバックグラウンドを変更するには、Component の適切なメソッドを使用します。 パラメータ: color - 以降の clearRect の呼び出しで 使用されるバックグラウンドカラー 引数に背景を塗りつぶす色として指定したいColorクラスのオブジェクトを指定します。Colorクラスについては『Colorクラス』を参照して下さい。 具体的には次のように記述します。 public void paintComponent(Graphics g) { Graphics2D g2 = (Graphics2D)g; g2.setBackground(Color.PINK); g2.clearRect(0, 0, getWidth(), getHeight()); } 下記のサンプルを実行してみよう。 /** * 背景を指定の色でクリアする */ import javax.swing.*; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.geom.*; import java.awt.Color; public class Graphics2DTest5 extends JPanel{ public static void main(String[] args){ JFrame frame = new JFrame(); Graphics2DTest5 app = new Graphics2DTest5(); frame.getContentPane().add(app); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setBounds(10, 10, 300, 200); frame.setTitle("タイトル"); frame.setVisible(true); } public void paintComponent(Graphics g){ Graphics2D g2 = (Graphics2D)g; g2.setBackground(Color.PINK); g2.clearRect(0, 0, getWidth(), getHeight()); } }上記をコンパイルして、実行すると下記のように表示されます。 ![]() |
|