Graphicsクラスの使用

さまざまな要因が人々にソフトウェアプログラムを書くように促します。多くの人にとって、モチベーションは、グラフィックを作成したり、画像を操作したり、アニメーション化したりしたいという欲求から生まれると思います。アーケードゲーム、フライトシミュレーター、CADパッケージのいずれを作成する場合でも、開発者は描画を学ぶことから始めることがよくあります。

Abstract Windowing Toolkit(またはAWT)内のグラフィックツールボックスを使用すると、Javaプログラマーは、単純な幾何学的形状を描画し、テキストを印刷し、フレーム、パネル、キャンバスなどのコンポーネントの境界内に画像を配置できます。

このコラムは、グラフィックスのトピックに関する私の最初のコラムです。Graphics単純な幾何学的形状を描画するためのクラスとそのメソッドに焦点を当て、ペイント(および再ペイント)が行われるプロセスを紹介します。

センターステージ、つまりGraphicsクラスから始めましょう。

グラフィッククラス

プログラマーは、GraphicsJavaを介して画像を描画する前に、クラスを理解することが不可欠です。このGraphicsクラスは、AWT内のすべてのグラフィックス操作のフレームワークを提供します。これは、2つの異なる、しかし関連する役割を果たします。まず、それはグラフィックスのコンテキストです。グラフィックコンテキストは、描画操作に影響を与える情報です。これには、背景色と前景色、フォント、およびクリッピング長方形(グラフィックを描画できるコンポーネントの領域)の位置と寸法が含まれます。グラフィック操作自体(画面または画像)の最終的な宛先に関する情報も含まれます。第二に、Graphicsクラスは、単純な幾何学的形状、テキスト、および画像をグラフィックスの宛先に描画するためのメソッドを提供します。グラフィックスの宛先へのすべての出力は、これらのメソッドの1つを呼び出すことによって行われます。

描画するために、プログラムは有効なグラフィックスコンテキスト(Graphicsクラスのインスタンスによって表される)を必要とします。このGraphicsクラスは抽象基本クラスであるため、直接インスタンス化することはできません。インスタンスは通常、コンポーネントによって作成され、コンポーネントのupdate ()メソッドとpaint()メソッドへの引数としてプログラムに渡されます。これらの2つのメソッドは、repaint()メソッドとともに、次のセクションで説明します。

メソッド

グラフィックの表示には、次の3つの方法が関係します。それぞれのデフォルトバージョンは、クラスによって提供されComponentます。目的のグラフィック操作を実行するには、メソッドupdate()およびpaint()を再定義する必要があります。

repaint()

public void repaint()public void repaint(long tm)public void repaint(int x、int y、int w、int h)public void repaint(long tm、int x、int y、int w、int h)

repaint()メソッドは、コンポーネントの再ペイントを要求します。呼び出し元は、再描画をできるだけ早く実行するように要求することも、ミリ秒単位で期間を指定することもできます。期間が指定されている場合、期間が経過する前にペイント操作が実行されます。呼び出し元は、コンポーネントの一部のみを再描画するように指定することもできます。この手法は、ペイント操作に時間がかかり、ディスプレイの一部のみを再ペイントする必要がある場合に役立ちます。リスト1のコードは、プログラムでrepaint()メソッドを使用する方法を示しています。

boolean mouseDown(Event e、int x、int y){selected_object.move(x、y); repaint(); }

リスト1:マウスダウンイベントハンドラー

mouseDown()イベントハンドラーのコードは、マウスの位置に基づいてディスプレイ内のオブジェクトの位置を再計算し、repaint()メソッドを呼び出して、ディスプレイをできるだけ早く再描画する必要があることを示します。

更新()

public void update(Graphics g)

アップデート()メソッドは、に応答して呼び出される再描画()要求、又は成分の一部に応答して明らかにされているか、最初に表示されます。メソッドの唯一の引数は、Graphicsクラスのインスタンスです。Graphicsインスタンスのみのコンテキスト内で有効な更新()メソッド(およびそれが呼び出すメソッド)が、すぐ後に廃棄されている更新()メソッドが戻ります。Componentクラスによって提供されるデフォルトの実装は、背景を消去し、paint()メソッドを呼び出します(以下)。

ペイント()

パブリックボイドペイント(グラフィックスg)
塗料()メソッドが呼び出されたから更新()メソッド、および実際にグラフィックスを描画するための責任があります。メソッドの唯一の引数は、Graphicsクラスのインスタンスです。クラスによって提供されるデフォルトの実装Componentは何もしません。

コンポーネントの塗り直し方法

ディスプレイの再描画に必要な時間を短縮するために、AWTは2つのショートカットを使用します。

  • まず、AWTは、カバーされていないか、再描画を要求したために、再描画が必要なコンポーネントのみを再描画します。


    
  • 次に、コンポーネントがカバーされていてカバーされていない場合、AWTは以前にカバーされていたコンポーネントの部分のみを再描画します。

図1のアプレットを使用すると、このプロセスが発生したときにそれを観察できます。アプレットの上部にあるテキスト領域をしばらく無視し、ディスプレイの色付きの部分だけを見てください。別のウィンドウを使用して、アプレットの一部を一時的に覆ってから覆いを外します。覆われたアプレットの部分のみが再描画されることに注意してください。さらに、コンポーネント階層内での位置に関係なく、カバーされたコンポーネントのみが再描画されます。意図的に異なる色を使用することにより、アプレットはこの微妙な効果を目立たせます。この図のソースコードはこちらから入手できます。

図1:ブラウザの再描画

グラフィック座標系

次のセクションで説明するメソッドは、パラメータとして、形状の描画方法を指定する値を取ります。たとえば、drawLine()メソッドは4つのパラメーターを必要とします。最初の2つのパラメーターは行の先頭の位置を指定し、最後の2つのパラメーターは行の終わりの位置を指定します。drawLine()メソッドに渡される正確な値は、有効な座標系によって決定されます。

座標系は、空間内のポイントの位置を明確に指定するための方法です。AWTの場合、この空間は平面と呼ばれる2次元の表面です。平面内の各位置は、x座標とy座標と呼ばれる2つの整数で指定できます。x座標とy座標の値は、原点からのポイントのそれぞれの水平方向と垂直方向の変位に基づいて計算されます。AWTの場合、原点は常に平面の左上隅の点です。座標値は0(xの場合)と0(yの場合)です。)。図2の図は、2つのポイントを示しています。1つは原点にあり、もう1つは原点から7つ下の位置にあります。

図2:座標平面

グラフィックスプリミティブ

このセクションでは、線、長方形、楕円と円弧、およびポリゴンを描画する方法を紹介します。これらのメソッドは有効なGraphicsインスタンスで呼び出された場合にのみ機能するため、コンポーネントのupdate ()メソッドとpaint()メソッドのスコープ内でのみ使用できます。以下の方法のほとんどはペアで提供されます。一つの方法(drawX()メソッド)は、所定の形状の輪郭だけを描画し、他の方法(fillX()メソッド)は、指定された形状の充填されたバージョンを描画します。

void drawLine(int xBegin、int yBegin、int xEnd、int yEnd)

これは、すべてのグラフィックス方法の中で最も単純です。指定された開始点と終了点の間に、幅1ピクセルの直線を描画します。結果の線は、現在のクリッピング領域の境界内に収まるようにクリップされます。線は現在の前景色で描画されます。

図3のアプレットは、drawLine()メソッドの動作を示しています。ソースコードはこちらから入手できます。このアプレットと図4、6、および7のアプレットには、NewCanvasクラスとFigureインターフェイスの2つのサポートクラスのサービスが必要です。NewCanvasクラスはCanvasクラスを拡張し、図形用の特殊な描画面を提供します。NewCanvasクラスのソースコードはこちらから入手できます。Figureインターフェイスは、NewCanvasで使用するためにFigureが提供する必要のあるメソッドを定義します。Figureインターフェイスのソースコードはこちらから入手できます。

図3:線画のデモンストレーション

長方形
void drawRect(int x、int y、int w、int h)void fillRect(int x、int y、int w、int h)void drawRoundRect(int x、int y、int w、int h、int arcWidth、int arcHeight )void fillRoundRect(int x、int y、int w、int h、int arcWidth、int arcHeight)void draw3DRect(int x、int y、int w、int h、boolean raise)void fill3DRect(int x、int y、int w、int h、ブールレイズ)

これらの各グラフィックスメソッドでは、パラメータとして、長方形を開始するx座標とy座標、および長方形の幅と高さが必要です。幅と高さの両方が正の整数である必要があります。結果の長方形は、現在のクリッピング領域の境界内に収まるようにクリップされます。長方形は現在の前景色で描画されます。長方形には3つの異なるスタイルがあります。プレーン、角が丸い、わずかな(ただし、見づらいことが多い)3次元効果です。

角丸長方形グラフィックスメソッドには、円弧の幅と高さの2つの追加パラメータが必要であり、どちらも角の丸みを制御します。3次元の長方形の方法では、長方形を沈めるか上げるかを示す追加のパラメーターが必要です。

図4のアプレットは、これらのメソッドの動作を示しています。ソースコードはこちらから入手できます。

図4:長方形の描画のデモンストレーション

楕円と弧

void drawOval(int x、int y、int w、int h)void fillOval(int x、int y、int w、int h)void drawArc(int x、int y、int w、int h、int startAngle、int arcAngle )void fillArc(int x、int y、int w、int h、int startAngle、int arcAngle)

これらの各グラフィックスメソッドでは、パラメータとして、楕円または円弧の中心のx座標とy座標、および楕円または円弧の幅と高さが必要です。幅と高さの両方が正の整数である必要があります。結果の形状は、現在のクリッピング領域の境界内に収まるようにクリップされます。シェイプは現在の前景色で描画されます。

円弧グラフィックスメソッドでは、円弧の始点と円弧のサイズを度(ラジアンではない)で指定するために、開始角度と円弧角度の2つの追加パラメーターが必要です。図5は、角度の指定方法を示しています。

図5:角度の仕様

図6のアプレットは、これらのメソッドの動作を示しています。ソースコードはこちらから入手できます。

図6:楕円形と円弧の描画のデモンストレーション

ポリゴン

void drawPolygon(int xPoints []、int yPoints []、int nPoints)void drawPolygon(Polygon p)void fillPolygon(int xPoints []、int yPoints []、int nPoints)void fillPolygon(Polygon p)

ポリゴンは、一連の線分から形成された形状です。各ポリゴングラフィックスメソッドは、パラメータとして、ポリゴンを構成する線分の端点の座標を必要とします。これらのエンドポイントは、次の2つの方法のいずれかで指定できます。1つは連続するx座標を表し、もう1つは連続するy座標を表す整数の2つの並列配列として。またはPolygonクラスのインスタンスを使用します。このPolygonクラスは、ポリゴン定義をポイントごとにアセンブルできるようにするメソッドaddPoint()を提供します。結果の形状は、現在のクリッピング領域の境界内に収まるようにクリップされます。

図7のアプレットは、これらのメソッドの動作を示しています。ソースコードはこちらから入手できます。

図7:ポリゴン描画のデモンストレーション

結論

信じられないかもしれませんが、これらのいくつかの単純なグラフィックプリミティブは、過去数か月でカバーしたすべて(AWT、イベント処理、オブザーバーなど)と組み合わされて、さまざまな有用なアプリケーションのヒープを作成するために必要なすべてです。 CADシステムへのゲーム。来月は、これらすべての断片をまとめて、私が何を意味するのかをお見せします。

乞うご期待。

Todd Sundstedは、コンピューターがデスクトップモデルで利用できるようになって以来、プログラムを作成してきました。もともとC ++で分散オブジェクトアプリケーションを構築することに興味がありましたが、Javaがその種のものの明白な選択になったとき、ToddはJavaプログラミング言語に移行しました。Toddは、執筆に加えて、米国南東部の企業にインターネットおよびWebコンサルティングサービスを提供しています。:END_BIO

このトピックの詳細

  • JavaクラスGraphicsAPI

    //java.sun.com/products/JDK/CurrentRelease/api/java.awt.Graphics.html

  • オブザーバーとオブザーバブル//www.sun.com/javaworld/jw-10-1996/jw-10-howto.html
  • 効果的なユーザーインターフェイス//www.sun.com/javaworld/jw-09-1996/jw-09-userint.html
  • Javaとイベントの処理//www.sun.com/javaworld/jw-08-1996/jw-08-event.html
  • AWTの概要//www.sun.com/javaworld/jw-07-1996/jw-07-awt.html

このストーリー「グラフィックスクラスの使用」は、もともとJavaWorldによって公開されました。