Java2D入門

Java 2D APIは、コアJava 1.2プラットフォームAPIです(APIとその実装に関するさまざまな情報については、「参考文献」を参照してください)。APIの実装は、Windows NT / 95およびSolaris用のSunJDKの現在のベータリリースのJavaFoundation Classes(JFC)の一部として利用できます。Java 1.2が完成すると、Java2Dはより多くのプラットフォームで利用できるようになるはずです。

Java 2DはJFCの他の部分とはある程度独立して開発されていますが、それでも1.2AWTのコア部分であることに注意してください。区別し、2D固有の機能について説明しますが、この機能は、古い1.0および1.1AWTサポートと同じように1.2グラフィックスの中心であることに注意してください。

Java 2Dは、2Dグラフィックスの描画、テキストとフォントの操作、画像のロードと使用、および色と色空間の定義と処理のために、以前のAWTメカニズムを拡張します。このコラムと今後のコラムでは、これらの新しいメカニズムについて説明します。

命名法と慣習についてのメモ

このコラムでは、私の主要な開発プラットフォームは、Windows95またはWindowsNTを実行しているPCになります。可能な場合は、他のプラットフォーム固有のヒントやコツを提供したいと思いますが、ほとんどの時間をWindowsで過ごすため、Windowsに焦点を当てます。

メソッド名を書くときは、常にmethodname()。の形式にする必要があります。末尾の括弧は、これをメソッドとして区別するためのものです。このメソッドは、パラメーターを受け取る場合と受け取らない場合があります。実際には、コンテキストは常にこれを明確にする必要があります。

ソースコードのリストは、行番号を含めて提供されます。必要に応じて、行番号を使用して記事のテキストとコードリストを相互参照する予定です。これにより、コピーを印刷することを選択した場合でも、列に注釈を付けることがはるかに簡単になります。ただし、列からリンクされているソースファイルは通常の* .javaファイル(行番号なし)であるため、ダウンロードして開発することができます。

今後数か月以内に多くのMediaおよびCommunicationsAPIについて作成する予定なので、すべてのサンプルコードが全体としても個々の部分でも意味があることを確認したいと思います。私は一貫して私の例に名前を付け、それらを官能的なパッケージに入れるように努めます。

パッケージ階層の最上位は次のようになります。

com.javaworld.media 

私が書いている各APIまたはトピックには、このトップレベルの下に少なくとも1つのサブパッケージがあります。たとえば、このJava2D記事のすべてのコードは次のようになります。

com.javaworld.media.j2d 

したがって、Java 2Dで最初のサンプルアプリケーションを呼び出すには、コードをダウンロードしてクラスパスに配置し、次を使用します。

java com.javaworld.media.j2d.Example01 

(名前空間が長すぎて好みに合わない場合、またはその他の理由で完全修飾名を使用せずにサンプルコードを使用する場合は、各ソースコードファイルの先頭にあるパッケージ行をコメントアウトするだけです。)

各記事のサンプルコードとクラスファイルのJavaアーカイブ(jar)ファイルを生成します。このアーカイブをダウンロードしてアーカイブ内から例を実行したい場合は、このアーカイブが各列のリソースで利用できるようになります。

また、現在および以前のメディアプログラミング列のすべてのコードとクラスを含む最新のjarファイルを保持します。この包括的なjarファイルは、私の個人Webサイトで入手できます。

例の最後のポイント:特に明記しない限り、スタンドアロンアプリケーションまたはアプレットを使用して各例を作成することにしました。これにより、コードが繰り返されることがありますが、個々の例の整合性を維持するのが最善だと思います。

慣習については十分です。Java 2Dでプログラミングを始めましょう!

Graphics2D:より優れたGraphicsクラス

Java 2D API内の中心的なクラスは、2Dレンダリング機能を拡張するためjava.awt.Graphics2Dにサブクラス化する抽象クラスjava.awt.Graphicsです。Graphics2Dさまざまな形状の操作に対するより均一なサポートを追加し、事実上、テキスト、線、およびその他のあらゆる種類の2次元形状の機能と有用性を同等にします。

Graphics2d参照を取得して使用する方法を示す簡単な例から始めましょう。

001パッケージcom.javaworld.media.j2d; 002 003 importjava.awt。*; 004 importjava.awt.event。*; 005 006 public class Example01 extends Frame {007 / ** 008 * Example01オブジェクトをインスタンス化します。 009 ** / 010 public static void main(String args []){011 new Example01(); 012} 013 014 / ** 015 * Example01コンストラクターは、フレームのサイズを設定し、016 *ビジュアルコンポーネントを追加して、ユーザーに表示します。 017 *アダプタクラスを使用して、フレームを閉じるユーザーを処理します。 019 ** / 020 public Example01(){021 //フレームにタイトルを付けます。 022 super( "Java 2D Example01"); 023 024 //フレームのサイズを設定します。 025 setSize(400,300); 026 027 // Visibleパラメータをtrueに設定して、フレームの可視性をオンにする必要があります028 // 029 setVisible(true); 030 031 //さて、リソースを適切に処理することを確認したい032 //ウィンドウが閉じているときにこのフレームが使用している。これには033 //匿名の内部クラスアダプタを使用します。 034 addWindowListener(new WindowAdapter()035 {public void windowClosing(WindowEvent e)036 {dispose(); System.exit(0);} 037} 038); 039} 040 041 / ** 042 *ペイント方法は本当の魔法を提供します。ここでは、043 * GraphicsオブジェクトをGraphics2Dにキャストして、044 *グラフィックスで使用するのに慣れている045 * Graphics2Dと同じ古いグラフィックス機能を使用できることを示しています。 046 ** / 047 public void paint(Graphics g){048 //これは、幅049 // 200、高さ200、x = 50、y = 50で始まる正方形を描画するために使用した方法です。 050 g.setColor(Color.red); 051 g.drawRect(50,50,200,200); 052 053 // Let '■Colorをblueに設定してから、Graphics2D 054 //オブジェクトを使用して、正方形からオフセットされた長方形を描画します。 055 //これまでのところ、Graphics2Dを使用して、056 // Graphicsを使用して実行できなかったことは何もしていません。 (実際には057 // Graphicsから継承されたGraphics2Dメソッドを使用しています。)058 Graphics2D g2d =(Graphics2D)g; 059 g2d.setColor(Color.blue); 060 g2d.drawRect(75,75,300,200); 061} 062}

Example01を実行すると、次の図に示すように、赤い正方形と青い長方形が表示されます。JDK 1.2 Beta3のWindowsNT / 95バージョン(このコラムの時点での最新の1.2リリース)には既知のパフォーマンスの問題があることに注意してください。この例がシステムで非常に遅い場合は、JavaWorld Javaヒント55に記載されているバグを回避する必要があります(このヒントについては、以下のリソースを参照してください)。

Graphicsオブジェクトを直接インスタンス化しないのと同じように、オブジェクトもインスタンス化しないことに注意してくださいGraphics2D。むしろ、Javaランタイムはレンダリングオブジェクトを構築してpaint()(Example01コードリストの047行目)に渡します。Java1.2プラットフォーム以降では、このオブジェクトはGraphics2D抽象クラスも実装します。

これまでのところ、2Dグラフィックス機能で特に特別なことは何もしていません。前の例のpaint()メソッドの最後にコードを追加して、Java 2D(Example02)の新機能をいくつか取り入れましょう。

001 / ** 002 *ここでは、アフィン003 *変換やShapeオブジェクト(この場合は汎用の004 * 1、GeneralPath)などの新しいJava 2DAPI機能を使用します。 005 ** / 006 public void paint(Graphics g){007 g.setColor(Color.red); 008 g.drawRect(50,50,200,200); 009 010 Graphics2D g2d =(Graphics2D)g; 011 g2d.setColor(Color.blue); 012 g2d.drawRect(75,75,300,200); 013 014 //次に、別の長方形を描画しますが、今回は015 // GeneralPathを使用してセグメントごとに指定します。 016 //さらに、AffineTransformを使用して、この017 //長方形をデバイス空間に対して(したがって、最初の2つの四角形に)変換および回転します。 019 //色も変更します。 020GeneralPathパス= new GeneralPath(GeneralPath.EVEN_ODD); 021 path.moveTo(0.0f、0.0f); 022 path.lineTo(0.0f、125.0f); 023 path.lineTo(225.0f、125.0f);024 path.lineTo(225.0f、0.0f); 025 path.closePath(); 026 027 AffineTransform at = new AffineTransform(); 028 at.setToRotation(-Math.PI / 8.0); 029 g2d.transform(at); 030 at.setToTranslation(50.0f、200.0f); 031 g2d.transform(at); 032 033 g2d.setColor(Color.green); 034 g2d.fill(path); 035}

GeneralPathjava.awt.geomパッケージに含まれているため、インポート行も追加する必要があることに注意してください。

importjava.awt.geom。*; 

Example02の出力を次の図に示します。

Java 2Dでは、java.awt.Shapeインターフェースを使用して任意の形状を指定できます。長方形、ポリゴン、2Dラインなど、さまざまなデフォルトの形状がこのインターフェイスを実装しています。柔軟性の観点からこれらの中で最も興味深いものの1つはjava.awt.geom.GeneralPathです。

GeneralPath■任意の数のエッジと潜在的に非常に複雑な形状を持つパスを記述できます。 Example02では、長方形(020-025行)を作成しましたが、五角形、七角形、またはその他の多面ポリゴンを作成するために、別の1つまたは複数の辺を簡単に追加することもできます。また、標準Graphicsコードとは異なり、Java 2Dでは、整数の代わりに浮動小数点数を使用して座標を指定できることにも注意してください。世界のCADベンダー、喜んでください!実際、Java 2Dはinteger、多くの場所で、、、doubleおよびfloating算術演算をサポートしています。

パスを作成したときGeneralPath.EVEN_ODDに、コンストラクターにパラメーター、を渡したことに気付いたかもしれません(行020)。このパラメータは、パスで指定されたシェイプの内側を決定する方法をレンダラーに指示するワインディングルールを表します。Java 2Dワインディングルールの詳細については、「参考文献」で参照されているJava 2Djavadocのドキュメントを参照してください。

Example02の他の主要な革新は、java.awt.geom.AffineTransformsの使用を中心に展開しています(行027-031)。このような変換の詳細は読者に任せます(これについて詳しく説明している記事については、「参考文献」を参照してください)が、AffineTransformJava 2Dグラフィックを操作して変換(移動)、回転できると言えば十分です。、スケーリング、せん断、またはこれらの操作の組み合わせを実行します。

鍵となるのAffineTransformは、デバイススペースユーザースペースの概念です。デバイススペースは、グラフィックが画面にレンダリングされる領域です。これは、通常のAWTスタイルGraphicsベースの2Dグラフィックスを作成するときに使用される座標に類似しています。ただし、ユーザースペースは、翻訳可能で回転可能な座標系であり、1つまたは複数AffineTransformのによって操作できます。

デバイス空間とユーザー空間の座標系は最初は重なり合っており、原点はレンダリングサーフェス(ここではフレーム)の左上にあります。正のx軸は原点から右に移動し、正のy軸は下に移動します。

Example02の最初の変換(行028および029)の後、ユーザースペース座標系はデバイススペースに対して反時計回りに22.5度回転しました。どちらも同じ起源を共有しています。(回転はラジアンで指定され、-PI / 8ラジアンは-22.5度または22.5度CCWに等しいことに注意してください。)ここで停止して長方形を描画すると、ほとんどの場合、の視野から外れて回転します。アプリケーションFrame

次に、回転が完了した後、2番目の変換(行030および031)を適用します。これは変換です。これにより、ユーザースペースの座標系がデバイススペースに対して移動し、200.0(フロート)単位下にシフトし、右に50.0(フロート)単位シフトします。

緑の長方形を塗りつぶすと、デバイススペースを基準にして平行移動および回転されます。

ベジェおよび高次曲線の

Now that we have examined how transforms can be used to manipulate graphical objects, let's reexamine how we build complex and interesting arbitrary shapes.

Curves are used throughout mathematics and computer graphics to approximate complex shapes using a finite, well-defined (and ideally small) number of mathematical points. Whereas the standard AWT did not directly support drawing with arbitrary curves in the past (Java 1.0 or 1.1 platforms), Java 2D adds built-in support for first-, second-, and third-order curves. You can draw curves with two end points and zero, one, or two control points. Java 2D computes first- and second-order curves using linear and quadratic formulas and cubic, or third-order, curves using Bezier curves.

(ベジェ曲線は、閉じた曲線と曲面の計算に関連するいくつかの非常に望ましい特性を持つパラメトリック多項式曲線の一種です。これらは多くのグラフィックアプリケーションで使用されます。パラメトリック多項式とベジェ曲線の使用の詳細については、リソースを参照してください。 。コンピュータグラフィックスで)GeneralPathこれらの曲線のそれぞれを描く方法は以下のとおりです。

  • lineTo() 直線セグメントの場合(端点のみを指定)
  • quadTo() 二次曲線の場合(1つの制御点を指定)
  • curveTo() 3次曲線の場合(3次ベジェ曲線を使用して描画された2つの制御点を指定します)