目次 | 前の項目 | 次の項目 | Java 2D API |
Java 2DTM API では、JDK 1.1 に対する下位互換性が維持されています。 また、プラットフォームからの独立性が保たれるように設計されています。
下位互換性を保証するため、グラフィックスとイメージングに関する JDK の既存のクラスとインタフェースの機能は残されています。 既存の機能は削除されておらず、既存のクラスについてのパッケージの定義は変更されていません。 AWT の機能の拡張は、既存のクラスでの新しいメソッドの実装、既存のクラスの拡張、従来の API に影響を与えない新しいクラスとインタフェースの追加などで行われています。たとえば、Java 2D API の機能の多くは、拡張されたグラフィックスコンテキストである Graphics2D を通して実現されています。 下位互換性を保ったままこの拡張グラフィックスコンテキストを提供するため、Graphics2D は JDK 1.1 の Graphics クラスを継承しています。
グラフィックスコンテキストの使用モデルも、変更されていません。 AWT は、次のメソッドを使って、AWT の Component にグラフィックスコンテキストを渡します。
JDK 1.1 のアプレットは、渡されたグラフィックスコンテキストを Graphics のインスタンスとして解釈します。 Java 2D API と互換性のあるアプレットが、Graphics2D で実装されている新しい機能にアクセスするには、グラフィックスコンテキストを Graphics2D オブジェクトにキャストします。
public void paint (Graphics g) { Graphics2D g2 = (Graphics2D) g; ... ... g2.setTransform (t); }
従来のクラスを継承するのではなく、Java 2D API が従来のクラスを一般化している場合もあります。 従来のクラスの一般化には、次の 2 種類の方法が使われています。
たとえば、AWT の Rectangle クラスの一般化には、両方の方法が使われています。 Rectangle クラスの階層は次のように変更されています。
java.lang.Object | +-------java.awt.geom.RectangularShape | +---------java.awt.geom.Rectangle2D | +-------java.awt.Rectangle
JDK 1.1 では、Rectangle は Object を直接継承していました。 JDK 1.2 では、Rectangle は 新しい Rectangle2D クラスを継承し、Shape と Serializable の両方を実装しています。 Rectangle の階層には、2 つの親クラス RectangularShape と Rectangle2D が追加されました。 JDK 1.1 用に作成されたアプレットは、新しい親クラスとインタフェースの実装に対応していませんが、旧バージョンにあったメソッドとメンバはまだ Rectangle に含まれているので、アプレットが影響を受けることはありません。Java 2D API では、従来の API と「直交する」新しいクラスとインタフェースがいくつか追加されています。 追加されたクラスとインタフェースは、既存のクラスを継承または一般化するものではなく、まったく新しい別のものです。 これらの新しいクラスとインタフェースは、従来の API では明示的に示されていない概念を具体化しています。
たとえば、Java 2D API では、Arc2D、CubicCurve2D、QuadCurve2D など、新しい Shape クラスがいくつか実装されています。 旧バージョンの AWT でも drawArc メソッドと fillArc メソッドを使って円弧をレンダリングできましたが、円弧の汎用的な抽象表現はなく、円弧を具体化する独立したクラスもありませんでした。 このような独立したクラスが、Java 2D API では追加されています。 ただし、Graphics クラスを通して drawArc と fillArc はまだサポートされているので、従来のアプレットには影響ありません。
プラットフォームに依存しないアプリケーションを開発できるよう、レンダリング先の装置の解像度、色空間、およびカラーモデルについて、Java 2D API ではどのような前提もありません。 また、イメージファイルについても特定の形式は想定されていません。本当の意味でプラットフォームに依存しないフォントは、組み込みのフォント (JDK の一部として提供されている) の場合、あるいは数学的またはプログラム的にフォントが生成される場合にだけ可能です。 現在、Java 2D API では、組み込みフォントまたは数学的なフォントの生成はサポートされていませんが、グリフのセットを使って、フォント全体をプログラムで定義することは可能です。 この場合、それぞれのグリフは、線分と曲線で構成される Shape で定義されます。 固有のスタイルとサイズを持つさまざまなフォントを、単一のグリフセットから生成できます。