グラフィック・オブジェクトは、位置、サイズ、形状、描画方法などのジオメトリー・プロパティーのセットによって定義されています。これらのプロパティーはメソッドの特別なグループで設定されています。これらのメソッドのうち、 draw
IlvGraphic
. と boundingBoxIlvGraphic
. は基本的なものであるため、一緒に定義する必要があります。
boundingBox メソッド
バウンディング・ボックスはグラフィック・オブジェクトを囲む最小の矩形を定義します。次のメソッドによって返されます。
public IlvRect boundingBox(IlvTransformer t)
IlvTransformer パラメーターは、オブジェクトを特定の描画ポート (トランスフォーマー を参照) で描画するために使用される 2 次元変換行列です。
この変換は、ズーム、回転、宛先描画ポートでのグラフィック・オブジェクトの移動に対応できます。グラフィック・オブジェクトが指定の変換で描画された場合は、同メソッドでそのグラフィック・オブジェクトが含まれる矩形を返す必要があります。
![boundingbox.gif](../../JViews_Framework/usressfwork/_media/boundingbox_default.gif)
グラフィック・オブジェクトのバウンディング・ボックス
次の例は、
drawrect
フィールドを持つグラフィック・オブジェクトの形状を定義します。オブジェクトのバウンディング・ボックスを返すためには、boundingBox
メソッドは矩形にトランスフォーマーを適用するだけです。class MyRectangle extends IlvGraphic { // The geometric rectangle that defines the object. final IlvRect drawrect = new IlvRect(); //constructor public MyRectangle(float x, float y, float width, float height) { drawrect.reshape(x, y, width, height); } // The bounding box method. public IlvRect boundingBox(IlvTransformer t) { //Copies the original rectangle to avoid its modification IlvRect rect = new IlvRect(drawrect); if (t != null) t.apply(rect); return rect; } }
boundingBox
メソッドは、非常に重要なメソッドです。非常に頻繁に呼び出されるため、高度に最適化した方法で記述する必要があります。メモ
MyRectangle クラスを正しくコンパイルするには、
draw
、copy
、および applyTransform
の各メソッドをオーバーロードする必要があります。例については、「ShadowEllipse クラス」を参照してください。draw メソッド
draw
メソッドはグラフィック・オブジェクトの描画に使用します。メソッドのシグニチャーは以下のようにして行います。public void draw(Graphics dst, IlvTransformer t)
dst
パラメーターは、オブジェクトが描画されるターゲットの Graphics
です。boundingBox
メソッドと同様、IlvTransformer
パラメーターは、描画ポートのオブジェクトの描画に使用する 2 次元変換マトリックスです。メモ
このメソッドで描画されるものはすべて、オブジェクトの矩形領域 (同じ変換パラメーターでメソッド
boundingBox
を呼び出した結果であるオブジェクトの矩形領域) 内に描画する必要があります。そのためにこれらの 2 つのメソッドは一緒に定義する必要があります。オブジェクトを描画するために、AWT
Graphics
クラスの描画メソッドを使用します。Java™
2 を使用して Java2D™
描画を行う必要がある場合は、Graphics2D
オブジェクトの dst
パラメーターを投じて、このクラスの描画メソッドを使用できます。ズーム可能およびズーム不可オブジェクト
グラフィック・オブジェクトは、バウンディング・ボックスがズーム・レベルに従う場合、ズーム可能 と呼ばれます。つまり、トランスフォーマー で
boundingBox
メソッドを呼び出す結果は、null
トランスフォーマーで boundingBox
を呼び出してから、トランスフォーマーを結果の矩形に適用する場合と同じです。つまり、次のとおりです。obj.boundingBox(t) = t.apply(obj.boundingBox(null))
ズーム可能オブジェクトは、倍率に従います。ビューが 2 倍に拡大されると、ズーム可能オブジェクトは 2 倍の大きさで描画されます。ビューが 1/2 に縮小されると、ズーム可能オブジェクトは半分の大きさで描画されます。ズーム不可オブジェクトは、倍率に従いません。つまり、縮小ビューに元のサイズで描画されます。
正確に言うと、グラフィック・オブジェクトはすべてのトランスフォーマー
t
に対してのみズーム可能で、obj.boundingBox(t)
を呼び出して取得した矩形は、トランスフォーマーを obj.boundingBox(null)
に適用して取得した矩形に含まれます。矩形の等価性は必要ありません。重要
ユーザー独自のグラフィック・オブジェクトを定義する場合、
zoomable()
を正しく定義しなければなりません。zoomable()
が true
を返すが、オブジェクトが倍率に従わない場合、オブジェクトが適切に描画されていない可能性があります。Rogue Wave JViews では、ズーム可能オブジェクトとズーム不可オブジェクトの管理方法は大きく異なり、ズーム可能オブジェクトの方がより最適化された方法で管理されています。オブジェクトがズーム可能であるかどうかを確認するには、
zoomable
メソッドを呼び出します。public boolean zoomable()
クラス IlvGraphic の戻り値は
true
です。ポイントがオブジェクト形状の一部かどうかのテスト
インタラクターが
contains
メソッドを呼び出し、ポイントがオブジェクト形状の一部であるかどうかをチェックします。public boolean contains(IlvPoint p, IlvPoint tp, IlvTransformer t)
このメソッドのデフォルト実装では、指定ポイントがオブジェクトの矩形領域の中にあるかどうかをチェックします。このメソッドをオーバーライドして、オブジェクトの透明領域に対して
false
を返すようにできます。グラフィック・オブジェクトの移動およびサイズ変更
クラス IlvGraphic は、グラフィック・オブジェクトの移動とサイズ変更を行うための次のような多くのメソッドを提供します。
- オブジェクトの矩形領域の左上隅を、(
x
、y
) に移動します。 - オブジェクトの矩形領域の左上隅を、ポイント
p
に移動します。 - オブジェクトの矩形領域を、
IlvRect
パラメーターに設定します。 - ベクトル (
dx
、dy
) でオブジェクトの矩形領域を変換します。 - オブジェクトを
center
ポイントを基準に、angle
度の角度で回転させます。 - 係数 (
scalex
、scalex
) でオブジェクトの矩形領域をサイズ変更します。 - 新規サイズ (
neww
、newh
) でオブジェクトの矩形領域を変更します。
これらのメソッドはすべて
applyTransform
を呼び出して、グラフィック・オブジェクトの矩形領域を変更します。public void applyTransform(IlvTransformer t)
オブジェクトを正しく変換するためにオーバーライドする必要があるのは、このメソッドだけです。次のコード例は、この例のクラス
MyRectangle
における applyTransform
メソッドの使用法を示したものです。class MyRectangle extends IlvGraphic { // The rectangle that defines the object. final IlvRect drawrect = new IlvRect(); ... public void applyTransform(IlvTransformer t) { t.apply(drawrect); } }
このメソッドは変換を矩形に適用するだけです。
メモ
マネージャー (クラス IlvManager とそのサブクラス) に保存されているグラフィック・オブジェクトは、クワッドツリーにあります。つまり、クワッドツリーはグラフィック・オブジェクトの変更通知を受け取る必要があるため、グラフィック・オブジェクトで move を単に呼び出すことはできません。オブジェクトのバウンディング矩形を変更するすべてのメソッドは、 applyToObject を呼び出す必要があります。このメソッドはオブジェクトに関数を適用し、矩形領域の変更をクワッドツリーに通知します。クラス
IlvManager
には、このマネージャーが管理するグラフィック・オブジェクトの移動と形状変更をする便利なメソッドもいくつか含まれています。これらのメソッドを以下に示します。 moveObjectpublic void moveObject(IlvGraphic, float, float,
boolean)
reshapeObjectpublic void reshapeObject(IlvGraphic, IlvRect, boolean)
詳細は、「オブジェクトのジオメトリー・プロパティーの変更」を参照してください。