Java Drawing DrawTop

Language

JP  US  UK

 

図形要素

 H. Jyounishi, Tokyo Japan
 

Frame (Index), No frame                 version:0.3(latest)  

要旨:図形要素の抽象クラス(ShapeElement)に図形要素に共通するメソッドを記述し、 各図形要素に固有のメソッドはShapeElementの拡張クラスに記述する。図形要素の抽象クラスとその拡張クラスで用意するメソッドは、 図形の作成、移動・リサイズ、マトリックスによる座標変換などである。
グループ要素は、グループに所属する図形要素のコンテナをArrayListで記録する。 グループ要素のメソッドとして、グループの下位を再帰的に探索し、 全ての図形要素のコンテナ(ShapeContainer)を返すメソッドを用意する。
Classes on this page: ShapeElement, RectangleElement, RoundRectangleElement, EllipseElement, ImageElement, LineElement, PolylineElement, CubicCurveElement, GeneralCurveElement, GroupElement
関連事項:
図形要素の表示=> Drawing Panel 図1

1. 図形要素の種類

矩形(RectangleElement)、コーナーR矩形(RoundRectangleElement)、楕円/円(EllipseElement)、 直線(LineElement)、折れ線(PolylineElement)、三次曲線(CubicCurveElement)、 一般曲線(GeneralCurveElement)など。GeneralCurveElementは 図形の切断曲線の結合の結果得られる曲線で、 直線、楕円/円弧、折れ線、三次曲線を任意に接続した形式をしている。
特殊な図形要素としてはImageElementがある。これは画面上で選択した図形のイメージ(画像)を要素とするもので、 他のアプリケーションとCopy and Pasteでimageのやり取りを行うために用意した要素である。 MS Word, MS PowerPointへのPasteやその逆のPasteもできる。
もうひとつの特殊な図形要素はグループ要素で、図形データは持たず子要素(ShapeContainer)のリストを持っている。


2. ShapeElement抽象クラス 戻る=>page top
public abstract class ShapeElement
ShapeElement抽象クラスが図形要素のベースであり、各種の図形要素はこのクラスの拡張クラスとして定義される。
フィールド 説明
shapeContainer ShapeContainer shapeContainer
この図形要素を保有するShapeContainerを設定する。
curve2D Curve2D curve2D
図形要素の直線、曲線を表すパラメトリック曲線(Curve2D)。
curve2DSave Curve2D curve2DSave
mouseStartメソッドで設定される。 mouseDraggedメソッドで図形の移動・リサイズなどを行うとき、初期状態を記録する。 このフィールドにはCurve2Dデータを記録する。
textAreaSave Rectangle2D textAreaSave
ShapeContainerが保持するTextBoxオブジェクトの領域< A href="TextBox.php#TextBox.textArea" target="_self">textAreaをストアする。
startPoint Point2D startPoint
通常はマウスドラッグの開始点を設定する。
startBox Rectangle2D startBox
mouseStartメソッドで設定される。 mouseDraggedメソッドで図形の移動・リサイズなどを行うとき、初期状態を記録する。 このフィールドには図形要素を囲む矩形を記録する。
discreteAngledLine DiscreteAngledLine discreteAngledLine
mouseStartメソッドで設定される。 このフィールドにはDiscreteAngledLine オブジェクトを記録する。
workVector Vector workVector
作業用Vector

メソッド 説明
getTypeE
(abstract)
public abstract int getTypeE()
Commandクラスで定義されている図形要素の種類を表す定数を返す。
Command.RECTANGLE/ROUNDRECTAGLE/ELLIPSE/IMAGE/LINE/POLYLINEなど
getShapeIdString
(abstract)
public abstract String getShapeIdString
図形要素を表す文字列を返す。"Rectangle、"Round_Rectangle"、"Line"、"Polyline"など
getShapeContainer public ShapeContainer getShapeContainer()
フィールド変数shapeContainerを返す。
setShapeContainer public void setShapeContainer(ShapeContainer container){
フィールド変数shapeContainerに引数を設定する。
isClosed public boolean isClosed()
閉図形のときtrueを返す。Curve2DのisClosedメソッドを呼ぶ。
getShape public Shape getShape()
java.awtに含まれるShapeインタフェースをインプリメントしたデータを取り出す。 ある点がShape図形の内部にあるかどうかをチェックするために良く使われる。
Shapeデータの取り出し方 => java.awt.geomの機能拡張
getCurve2D public Curve2D getCurve2D()
フィールド変数curve2Dを返す。
setCurve2D public void setCurve2D(Curve2D curve2D)
フィールド変数curve2Dに引数の値を設定する。
getGeneralCurveElement public GeneralCurveElement getGeneralCurveElement()
一般図形要素を GeneralCurveElementに変換して返す。
曲線を切断・分割を伴う処理で1本の曲線がマルチパス(サブパス)になる場合に、 それらが取り扱いできるGeneralCurveElementに変換するために使われる。
このメソッドの逆操作はGeneralCurveElement.getSimpleShapeElementsメソッド。
getSerializableCurve2D public abstract SerializableCurve2D getSerializableCurve2D()
ファイル書き込み用のデータだけからなる(メソッドを持たない)オブジェクトを取り出す。
Curve2D.getSerializableCurve2Dを呼ぶ。
setSerializableCurve2D public void setSerializableCurve2D(SerializableCurve2D sdata)
ファイル書き込み用のデータSerializableCurve2Dをこの図形要素オブジェクトにセットする。
図形要素をSerializableCurve2Dから再構成する場合に使う。
SerializableCurve2D.serializableSegments フィールドに設定されているSerializableSegment2Dの配列データを取り出す。
・SerializableSegment2Dの配列データから、Segment2Dの配列データを作成する
このSegment2Dの配列データからCurve2Dデータを作成し、この図形要素オブジェクトにセットする。
Curve2Dは抽象クラスなのでコンストラクターは直接呼べない。Curve2Dの拡張クラスのコンストラクターを呼んでCurve2Dデータを作成する。
=> SerializableCurve2DからCurve2Dを作成する方法
getBoundingBox public Rectangle2D getBoundingBox()
図形要素を囲むBoundingBoxを返す。
getEndPTs public abstract Point2D[] getEndPTs()
閉じていない図形要素の場合に両端の点を返す。閉じた図形要素の場合は長さ0の配列を返す。
createTextArea
(abstract)
public abstract Rectangle2D createTextArea()
ShapeContainer.addTextBoxメソッドから呼ばれる。
戻り値:
TextBoxオブジェクトのテキスト領域(textArea)を決めるRectangle2Dオブジェクトを返す。
処理:
この図形要素を保持するShapeContainerオブジェクトに ShapeContainer.addTextBoxメソッドでTextBoxを追加するとき、 このメソッドでテキスト領域(textArea)を表すRectangle2D取得する。
テキスト領域(textArea)はこのクラスが保持するcurve2Dに内接する矩形(Rectangle2D)である。
基本図形(RectangleElement, RoundRectangleElement, EllipseElement,...)に内接する矩形は簡単に求まるが、 折れ線(PolylineElement)、 三次曲線(CubicCurveElement)などの場合は少し面倒である。 特に凹部を持つ場図形の場合は厄介である。 この場合、ShapeElementUtil.getInscribedBoxで内接する矩形を取得する。
: このメソッドの実装はこのクラスの拡張クラスで行う。
=> 操作説明書 テキストボックス作成、追加、削除
getSegmentModifiers (abstract) public abstract SegmentModifier[] getSegmentModifiers()
getModifierPTs (abstract) public abstract Point2D[] getModifierPTs()
getSegmentModifiers
(abstract)
public abstract SegmentModifier[] getSegmentModifiers()
図形を変形するModifyShapeクラスで使う、制御点、接線ベクトルなどの制御用図形(SegmentModifier)を作成する。
ModifyShapeで変形できる図形要素は限定されているので注意。変形できない図形要素の場合、長さ0の配列を返す。
=> ModifyShapeSegmentModifier
getModifierPTs
(abstract)
public abstract Point2D[] getModifierPTs()
MousePositionLSで参照する。 マウスがこの制御点にヒットするとMousePositionInfo.CONTROL_POINTの位置情報を返す。
ここで言う制御点は制御用図形(SegmentModifier) から得られる全ての制御点で、例えば、折れ線の線分の中点、接線方向表示の線分の両端点などを含む。
mouseStart public void mouseStart(int ctrl, Point2D starPoint)
引数:
ctrl - マウスドラッグでShftキー/Ctrlキーを押している時、1または2、マウス右ボタンが押されるとctrl=3が渡される。
startPoint - ラッグ開始点マウスドラッグの開始時に呼ばれ、ドラッグ開始点を受け取る。
処理:
このメソッドはマウスボタンが押された時に MoveResizeShapeLS.init, ModifyShapeLS.mousePressed メソッドから呼ばれ、 マウスドラッグの間に書き換えられるデータをストアしておく。 これらのデータはマウスドラッグの間に初期データとして参照される。
mouseEnd public abstract void mouseEnd()
現在のところ何もしない。
create
(abstract)
public abstract void create (Point2D startPoint, Point2D currentPoint)
CreateShapeLS.mouseDraggedメソッドから呼ばれる
引数:
startPoint - ドラッグ開始点
currentPoint - ドラッグ現在点
処理:
このメソッドは直線を作る場合に呼ばれる。
create
(abstract)
public abstract void create(Point2D[] points)
CreateShapeLS.mouseMovedメソッドから呼ばれる。
節点列を受け取り、折れ線、三次曲線を作成する。
create
(abstract)
public abstract void create(Rectangle2D boundingBox)
CreateShapeLS.mouseDraggedメソッドから呼ばれる。
引数:
boundingBox - 作成中の閉図形を囲むBoxが渡される。
処理:
引数のBoxにフィットする閉図形を作る。
move public void move(int ctrl, Point2D currentPoint, boolean moveTextBox)
引数:
ctrl - Shift /Ctrlキーを押しなががらドラッグすると1 or 2が渡される。
currentPoint - マウスドラッグの現在点。
moveTextBox - trueならばテキストボックスも移動する。
処理:
MoveResizeShapeLSmouseDraggedから呼ばれ、この図形要素を移動する。
: このメソッドを呼ぶ前に mouseStart メソッドを呼ぶ必要がある。
resize public void resize(int ctrl, Point2D currentPoint, int mousePositionCode, boolean resizeTextBox)
引数:
ctrl - Shift /Ctrlキーを押しなががらドラッグすると1 or 2が渡される。
currentPoint - マウスドラッグの現在点。
mousePositionCode - MousePositionInfo が定義している位置情報で、この場合 NW_RESIZE - SW_RESIZE, N_RESIZE- W_RESIZEなど。
resizeTextBox - trueならばテキストボックスもリサイズする。
処理:
MoveResizeShapeLSmouseDraggedから呼ばれ、 この図形要素をリサイズする。
ShapeElementUtil.resizeRectangle スタテックメソッドで処理する。
:
(1) このメソッドを呼ぶ前に mouseStart メソッドを呼ぶ必要がある。
(2) このメソッドは UNRESIZABLEKEEP_ASPECT_RATIOのプロパティを考慮して動作する。
moveResize public void resize(Rectangle2D oldBox, Rectangle2D newBox, boolean resizeTextBox) 引数
oldBox: - 古いboxデータ。
newBox: - 現在のboxデータ。
resizeTextBox - trueならばテキストボックスもリサイズする。
処理:
oldBoxとnewBoxから移動量、拡大または縮小率を計算して、この図形要素に対し移動とリサイズの両方を実行する。
Segment2D.resizeSegmentメソッドで変換を行う。
この図形要素を持つShapeContainerがTextBoxを持てば、TextBoxもリサイズする。
moveEndPoint
(abstract)
public abstract void moveEndPoint(int ctrl, int movePtIndex, Point2D currentPoint)
MoveResizeShapeLS.mouseDraggedから呼ばれる。
引数:
ctrl - マウスドラッグでShftキー/Ctrlキーを押している時、1/2が渡される。
movingPtIndex - この引数が0のとき始点を動かす。0でないときは終点を動かす。
currentPoint - 現在のドラッグ点
処理:
曲線の端点をマウスで動かす場合に呼ばれる。
moveEndPoint
(abstract)
public abstract void moveEndPoint(int ctrl, int movePtIndex, Point2D oldPoint, Point2D newPoint)
引数:
ctrl - 移動方向を水平・垂直に限定するときは1/2を設定する。
movingPtIndex - この引数が0のとき始点を動かす。0でないときは終点を動かす。
oldPoint - 動かす点の位置。
newPoint - 動かす点の新しい位置。
処理:
このメソッドはマウスドラッグ情報なしに端点を移動するときに使う。
modify
(abstract)
public abstract void modify(int ctrl, Point2D oldPoint, Point2D currentPoint)
RoundRectangleElement, PolylineElement, CubicCureveElement, GeneralCurveElement
transform
public void transform(Matrix2D M)
この図形要素の輪郭線を表すCurve2Dデータに対して座標変換を施す。
引数:
M - Matrix2Dの変換マトリックス。
処理:
Segment2D.transformSegment
メソッドで変換を行う。
clone
(abstract)
public abstract Object clone()
図形要素のクローンを作成して返す。
toString
(abstract)
public abstract String toString()
図形要素の文字列表現を返す。

: SerializableCurve2DからCurve2Dを作成する方法
int curve2Dtype=sdata.type;
switch(curve2Dtype){
case Curve2D.RECTANGLE :{
this.curve2D=new Rectangle2DE(segments); break;
}
case Curve2D.ROUND_RECTANGLE :{
this.curve2D=new RoundRectangle2DE(segments); break;
}
case Curve2D.ELLIPSE :{
this.curve2D=new Ellipse2DE(segments); break;
}
case Curve2D.LINE:{
this.curve2D=new Line2DE(segments); break;
}
case Curve2D.POLYLINE:{
this.curve2D=new Polyline2DE(segments); break;
}
case Curve2D.CUBIC_CURVE :{
this.curve2D=new CubicCurve2DE(segments); break;
}
case Curve2D.GENERAL_CURVE :{
this.curve2D=new GeneralCurve2DE(segments); break;
}
} //switch


3. RectangleElement(矩形要素)クラス 戻る=>page top
public class RectangleElement extends ShapeElement
メソッド 説明
getTypeE public int getTypeE()
Command.RECTANGLEを返す。
getShapeIdString public String getShapeIdString()
"Rectangle"を返す。
createTextArea public Rectangle2D createTextArea()
このRectangleElementと同じ大きさのRectangle2Dを返す。
getSegmentModifiers public SegmentModifier[] getSegmentModifiers()
この図形要素は変形できない。長さ0の配列を返す。
getModifierPTs public CurvePT[] getModifierPTs()
この図形要素は変形できない。長さ0の配列を返す。
create public void create(Rectangle2D boundingBox)
boundingBoxのデータを使いRectangle2DEコンストラクタでオブジェクトを作成し、フィールド変数curve2Dに設定する。
=> ShapeElement.create
moveEndPoint public void moveEndPoint(int ctrl, int movePtIndex, Point2D currentPoint)
現在のところ使っていない
moveEndPoint public void moveEndPoint(int ctrl, Point2D oldPoint, Point2D currentPoint)
現在のところ使っていない
modify public void modify(int ctrl, Point2D oldPoint, Point2D currentPoint)
なにもしない。
modifyPoint public void modifyPoint(Point2D point, String command){}
なにもしない。
clone public abstract Object clone()
図形要素のクローンを作成して返す。
toString public abstract String toString()
図形要素の文字列表現を返す。


4. RoundRectangleElement(コーナーR矩形要素)クラス 戻る=>page top
public class RoundRectangleElement extends ShapeElement
フィールド 説明
segmentModifiers SegmentModifier[] segmentModifiers
この図形要素はコーナーRの半径を変更することができる。コーナーRの半径を変更するために必要な SegmentModifierオブジェクトをストアする。
hitSegmentModifier SegmentModifier hitSegmentModifier
マウスボタンを押したときにヒットしたSegmentModifierオブジェクトを ストアする。ヒットしたSegmentModifierオブジェクトの検出は SegmentModifier.getHitSegmentModifier メソッドで行う。

メソッド 説明
getTypeE public int getTypeE()
Command.ROUND_RECTANGLEを返す。
getShapeIdString public String getShapeIdString()
"Round_Rectangle"を返す。
createTextArea public Rectangle2D createTextArea()
このRoundRectangleElementに内接するRectangle2Dを返す。
getSegmentModifiers public SegmentModifier[] getSegmentModifiers()
この図形要素はコーナーRの半径を変更することができる。 左下隅のコーナーRの端点をSegmentModifierにセットして返す。
コーナーRの端点は2個なのでSegmentModifierも2個返す。
getModifierPTs public CurvePT[] getModifierPTs()
左下隅のコーナーRの両端点を返す。
mouseStart public void mouseStart(int ctrl, Point2D startPoint)
このメソッドは ShapeElement.mouseStartをオーバーライドする。
引数:
ctrl - 1 または 2 (Shift またはCtrl keyを押しているとき), 3 (マウス右ボタンを押したとき)
startPoint - マウスドラッグの開始点(mousePressedメソッドで取得).
処理:
getSegmentModifiers メソッドを呼んで、 その戻り値をsegmentModifiers フィールドにセットする。
SegmentModifier.getHitSegmentModifier メソッドを呼んで、その戻り値を hitSegmentModifier フィールドにセットする。
create public void create(Rectangle2D boundingBox)
boundingBoxのデータを使いRoundRectangle2DEコンストラクタでオブジェクトを作成し、フィールド変数curve2Dに設定する。
=> ShapeElement.create
moveEndPoint public void moveEndPoint(int ctrl, int movePtIndex, Point2D currentPoint)
現在のところ使っていない
moveEndPoint public void moveEndPoint(int ctrl, Point2D oldPoint, Point2D currentPoint)
現在のところ使っていない
modify public void modify(int ctrl, Point2D oldPoint, Point2D currentPoint)
引数:
ctrl - この図形要素では使用しない。
oldPoint - 一回前に呼ばれたときのドラッグ点。
currentPoint - 現在のドラッグ点。
処理:
コーナRの半径を変更する処理を行う。
マウスボタンを押した点に近い制御点を持つSegmentModifierはフィールド変数 hitSegmentModifierに設定されている。 このSegmentModifierから制御点を取り出し、この制御点が引数のcurrentPointに一致するようにコーナーRの半径を変える。
コーナR 半径が最大に達すると、それ以上は処理しない。
=> コーナーR矩形要素のR部変更
modifyPoint public void modifyPoint(Point2D point, String command){}
なにもしない。
clone
public abstract Object clone()
図形要素のクローンを作成して返す。
toString public abstract String toString()
図形要素の文字列表現を返す。


5. EllipseElement(楕円/円要素)クラス 戻る=>page top
public class EllipseElement extends ShapeElement
メソッド 説明
getTypeE public int getTypeE()
Command.ELLIPSEを返す。
getShapeIdString public String getShapeIdString()
"Ellipse"を返す。
createTextArea public Rectangle2D createTextArea()
このEllipseElementに内接するRectangle2Dを返す。
getSegmentModifiers public SegmentModifier[] getSegmentModifiers()
この図形要素は変形できない。長さ0の配列を返す。
getModifierPTs public CurvePT[] getModifierPTs()
この図形要素は変形できない。長さ0の配列を返す。
mouseStart public void mouseStart(int ctrl, Point2D startPoint)
なにもしない。
create public void create(Rectangle2D boundingBox)
boundingBoxのデータを使いRoundRectangle2DEコンストラクタでオブジェクトを作成し、フィールド変数curve2Dに設定する。
=> ShapeElement.create
moveEndPoint public void moveEndPoint(int ctrl, int movePtIndex, Point2D currentPoint)
現在のところ使っていない
moveEndPoint public void moveEndPoint(int ctrl, Point2D oldPoint, Point2D currentPoint)
現在のところ使っていない
modify public void modify(int ctrl, Point2D oldPoint, Point2D currentPoint)
なにもしない。
modifyPoint public void modifyPoint(Point2D point, String command){}
なにもしない。
clone
public abstract Object clone()
図形要素のクローンを作成して返す。
toString public abstract String toString()
図形要素の文字列表現を返す。


6. ImageElement(イメージ要素) 戻る=>page top
public class ImageElement extends ShapeElement

ImageElementは他の図形要素と異なり、クリップボードから画像をペースト(paste)した時に作成される。 ペーストすると左上隅に小さく表示されるが、画素数は元の画像と同じなので画像の品質は保たれている。

フィールドはShapeElementが宣言するフィールドに次のフィールドが追加になる。

フィールド 説明
bufferedImage private BufferedImage bufferedImage
イメージデータを記録する。

矩形領域にイメージを表示するのでメソッドはRectangleElementとほとんど同じである。 但しimageを扱うための固有のメソッドを持つ。
メソッド 説明
getTypeE public int getTypeE()
Command.IMAGEを返す。
getShapeIdString public String getShapeIdString()
"Image"を返す。
createTextArea public Rectangle2D createTextArea()
nullを返す。
getBufferedImage public Image getBufferedImage()
フィールド変数bufferedImageを返す。
getByteImage public byte[] getByteImage()
Image, BufferedImageクラスはSerializableではないのでファイルに書き込めない。
このメソッドでBufferedImageのデータをByteArrayOutputStreamでbyte配列に書き込む。
setByteImage public void setByteImage(byte[] byteData) :ImageElement固有メソッド
getByteImage メソッドの逆操作。byte配列のデータをByteArrayInputStreamでBufferedImageに書き込む。
getSamplingPTs public Point2D[] getSamplingPTs(Rectangle2D box)
RectangleElementと同じ。
getSamplingCurvePTs public CurvePT[] getSamplingCurvePTs(Rectangle2D box)
RectangleElementと同じ。
getSegmentModifiers public SegmentModifier[] getSegmentModifiers()
この図形要素は変形できない。長さ0の配列を返す。
getModifierPTs public CurvePT[] getModifierPTs()
この図形要素は変形できない。長さ0の配列を返す。
mouseStart public void mouseStart(int ctrl, Point2D startPoint){
現在のところ使っていない
create public void create(Rectangle2D boundingBox)
boundingBoxのデータを使いRectangle2DEコンストラクタでオブジェクトを作成し、フィールド変数curve2Dに設定する。
=> ShapeElement.create
moveEndPoint public void moveEndPoint(int ctrl, int movePtIndex, Point2D currentPoint)
現在のところ使っていない
moveEndPoint public void moveEndPoint(int ctrl, Point2D oldPoint, Point2D currentPoint)
現在のところ使っていない
modify public void modify(int ctrl, Point2D oldPoint, Point2D currentPoint)
なにもしない。
modifyPoint public void modifyPoint(Point2D point, String command){}
なにもしない。
clone
public abstract Object clone()
図形要素のクローンを作成して返す。
toString public abstract String toString()
図形要素の文字列表現を返す。


7. LineElement(直線要素) 戻る=>page top
public class LineElement extends ShapeElement
メソッド 説明
getTypeE public int getTypeE()
Command.LINEを返す。
getShapeIdString public String getShapeIdString()
"Line"を返す。
createTextArea public Rectangle2D createTextArea()
textBoxは付けられない。nullを返す。
getSegmentModifiers public SegmentModifier[] getSegmentModifiers()
使用していない。長さ0の配列を返す。
getModifierPTs public CurvePT[] getModifierPTs()
使用していない。長さ0の配列を返す。
mouseStart public void mouseStart(int ctrl, Point2D startPoint){
ShapeElement.mouseStart メソッドを呼ぶ。
create public void create(Point2D startPoint, Point2D currentPoint)
CreateShapeLS.mouseDraggedから呼ばれる。
Line2DEコンストラクタでオブジェクトを作成し、フィールド変数curve2Dに設定する。
=> ShapeElement.create
moveEndPoint public void moveEndPoint(int ctrl, int movePtIndex, Point2D currentPoint)
引数:
ctrl - マウスをドラッグするときShift/Ctrlキーを押していると1または2の値が渡される。
movingPtIndex - この引数が0のとき始点を動かす。0でないときは終点を動かす。
currentPoint - 現在のドラッグ点。
処理:
MoveResizeShapeLSのmouseDraggedメソッドから呼ばれる。
=> ShapeElement.moveEndPoint
moveEndPoint public void moveEndPoint(int ctrl, int movePtIndex, Point2D oldPoint, Point2D currentPoint)
引数:
ctrl - マウスをドラッグするときShift/Ctrlキーを押していると1または2の値が渡される。
movingPtIndex - この引数が0のとき始点を動かす。0でないときは終点を動かす。
oldPoint - ひとつ前のドラッグ点。
currentPoint - 現在のドラッグ点。
処理:
(注)このメソッドはConnectionクラスのresizeConnectorメソッドからも呼ばれる。 このメソッドはマウスドラッグによらず、一回の操作で直線の端点を動かすために用意してある。 ctrl>0の時は動かす方向を水平/垂直方向に限定する。
modify public void modify(int ctrl, Point2D oldPoint, Point2D currentPoint)
なにもしない。
modifyPoint public void modifyPoint(Point2D point, String command){}
なにもしない。
clone public abstract Object clone()
図形要素のクローンを作成して返す。
toString public abstract String toString()
図形要素の文字列表現を返す。


8. PolylineElement(折れ線要素)クラス 戻る=>page top
public class PolylineElement extends ShapeElement
メソッド 説明
getTypeE public int getTypeE()
Command.POLYLINEを返す。
getShapeIdString public String getShapeIdString()
"Polyline"を返す。
createTextArea public Rectangle2D createTextArea()
textBoxは付けられない。nullを返す。
getSegmentModifiers public SegmentModifier[] getSegmentModifiers()
使用していない。長さ0の配列を返す。
getModifierPTs public CurvePT[] getModifierPTs()
使用していない。長さ0の配列を返す。
mouseStart public void mouseStart(int ctrl, Point2D startPoint){
ShapeElement.mouseStart メソッドを呼ぶ。
create public void create(Point2D[] points)
Polyline2DEコンストラクタでオブジェクトを作成し、フィールド変数curve2Dに設定する。
=>ShapeElement.create
moveEndPoint public void moveEndPoint(int ctrl, int movePtIndex, Point2D currentPoint)
引数:
ctrl - マウスをドラッグするときShift/Ctrlキーを押していると1/2の値が渡される。
movePtIndex - 動かす点の識別子、0ならば始点、1ならば終点
currentPoint - 現在のドラッグ点。
処理:
MoveResizeShapeLSのmouseDraggedから呼ばれる。
moveLineSegmentを使って処理する。
moveEndPoint public void moveEndPoint(int ctrl, int movePtIndex, Point2D oldPoint, Point2D currentPoint)
引数:
ctrl - マウスをドラッグするときShift/Ctrlキーを押していると1/2の値が渡される。
movePtIndex - 動かす点の識別子、0ならば始点、1ならば終点
oldPoint - ひとつ前のドラッグ点。
currentPoint - 現在のドラッグ点。
処理:
このメソッドは折れ線をコネクターとして扱うときに便利なリサイズである。 MoveResizeShapeLSのmouseDraggedから呼ばれる。 ctrl>0の時は動かす方向を水平/垂直方向に限定する。
・折れ線の節点数が2点(直線)のときは、movingPointをcurrentPointとoldPointの差分量だけ動かす。
・折れ線の節点が3点以上のとき
movingPointとその隣の点を結ぶ線分を作成してmoveLineSegmentメソッドを呼び、線分を平行移動する。
=>moveEndPointの動作, 図形の移動・リサイズ Polyline 図3, 4
moveLineSegment private Line2D moveLineSegment(Line2D line, double moveX, double moveY)
引数:
line - 移動される直線
moveX - x方向移動量
moveY - y方向移動量
戻り値:
下図のnewLineを返す。
処理:
上のmoveEndPointメソッドから呼ばれ、引数lineを長さを変えて平行移動する。
lineの始点は(moveX, moveY)だけ移動し、lineの終点は線分の垂直方向にのみ動かす。 つまりlineの長さは変わるが方向は変わらず、lineの始点は指定量だけ動くのでマウスの動きに追随する。

=> moveEndPointの動作
modify public void modify(int ctrl, Point2D oldPoint, Point2D currentPoint)
なにもしない。
modifyPoint public void modifyPoint(Point2D point, String command){}
なにもしない。
clone public abstract Object clone()
図形要素のクローンを作成して返す。
toString public abstract String toString()
図形要素の文字列表現を返す。

: moveEndPointの動作 戻る=>page top
四角マークの端点をマウスで動かす。動かす端点の隣の点は、その点と端点を結ぶ線分の垂直方向に動かす。
端点とその隣の点を結ぶ線分の長さは変わるが、平行移動なので方向は変わらない。


Original



右端の端点を、右上へ移動

Original


右下の端点を、右上へ移動


元の図形

右の楕円を、右下へ移動
接続するコネクターの端点が移動する。


9. CubicCurveElement(三次曲線要素)クラス 戻る=>page top
public class CubicCurveElement extends ShapeElement
メソッド 説明
getTypeE public int getTypeE()
CUBIC_CURVEを返す。
getShapeIdString public String getShapeIdString()
"CubicCurve"を返す。
createTextArea public Rectangle2D createTextArea()
textBoxは付けられない。nullを返す。
getSegmentModifiers public SegmentModifier[] getSegmentModifiers()
使用していない。長さ0の配列を返す。
getModifierPTs public CurvePT[] getModifierPTs()
使用していない。長さ0の配列を返す。
mouseStart public void mouseStart(int ctrl, Point2D startPoint)
引数:
ctrl - マウスをドラッグするときShift/Ctrlキーを押していると1/2の値が渡される。
startPoint - マウスドラッグ開始点
処理:
ShapeElement.mouseStart メソッドを呼ぶ。
create public void create(Point2D[] points)
CubicCurve2DEコンストラクタでオブジェクトを作成し、フィールド変数curve2Dに設定する。
moveEndPoint public void moveEndPoint(int ctrl, int movePtIndex, Point2D currentPoint)
何もしない。
moveEndPoint public void moveEndPoint(int ctrl, int movePtIndex, Point2D oldPoint, Point2D currentPoint)
引数:
ctrl - マウスをドラッグするときShift/Ctrlキーを押していると1/2の値が渡される。
movingPoint - 0ならば始点を動かし、1ならば終点を動かす。
oldPoint - 一回前のドラッグ点。
currentPoint - 現在のドラッグ点。
処理:
このメソッドは折れ線の場合と異なり、回転と拡大/縮小変換で図形要素を変換する。 変換マトリックスはMatrix2D.getRotationMatrix メソッドで作成する。
CubicCurve2DE.getCtrlPointsで CubicCurveElementの制御点を全て取り出し、変換マトリックスを作用させる。
modify public void modify(int ctrl, Point2D oldPoint, Point2D currentPoint)
なにもしない。
modifyPoint public void modifyPoint(Point2D point, String command){}
なにもしない。
clone public abstract Object clone()
図形要素のクローンを作成して返す。
toString public abstract String toString()
図形要素の文字列表現を返す。


10. GeneralCurveElementクラス 戻る=>page top
public class GeneralCurveElement extends ShapeElement
任意の曲線セグメントを接続した曲線要素。曲線の切断・接続操作の結果として作成される。マウスドラッグ、マウスクリックなどの操作では作られないのでcreateメソッドはダミーにしている。 複数本の曲線からなるマルチパス(サブパス)を扱うことができる。
フィールド 説明
segmentModifiers SegmentModifier[] segmentModifiers
この図形要素はコーナーRの半径を変更することができる。 コーナーRの半径を変更するために必要なSegmentModifier オブジェクトをストアする。
hitSegmentModifier SegmentModifier hitSegmentModifier
マウスボタンを押したときにヒットしたSegmentModifier オブジェクトをストアする。ヒットしたSegmentModifierオブジェクトの検出は SegmentModifier.getHitSegmentModifier メソッドで行う。
topologyChanged boolean topologyChanged
modify shapeコマンドでサブパスが閉曲線になる、 サブパスが分割されるなど曲線のトポロジが変化したときにtrueになる。 例えば閉曲線になると、それ以後のマウスドラッグに対するmodifyメソッドは実行しない。

メソッド 説明
getTypeE public int getTypeE()
GENERAL_CURVEを返す。
getShapeIdString public String getShapeIdString()
"GeneralCurve"を返す。
createTextArea public Rectangle2D createTextArea()
textBoxは付けられない。nullを返す。
getSimpleShapeElements public ShapeElement[] getSimpleShapeElements()
マルチパスを分割して、一本のパスごとに図形要素を作成して返す。
返す図形要素はなるべく単純な図形要素に変換する。 例えば図形要素が一本の折れ線からなるとき、返される図形要素はPolylineElementである。
getSegmentModifiers public SegmentModifier[] getSegmentModifiers()
• この図形要素のcurve2Dの全節点について SegmentModifierを作成する。
• このメソッドはこのクラスのmouseStartメソッドから呼ばれる。

mouseStartメソッドはmodify shapeコマンドでマウスボタンを押したときに呼ばれる (ModifyShapeLS.mousePressed)。
• SegmentModifierの表示はDrawShapeUtil.drawSegmentModifiersで描画する。
• 実際の処理はSegmentModifierのstaticメソッド getSegmentModifiersで実行する。

getModifierPTs public CurvePT[] getModifierPTs()
節点、中間点、接線方向を示す直線(Segment2Dオブジェクト)の両端を全て制御点として返す。
mouseStart public void mouseStart(int ctrl, Point2D startPoint)
引数:
ctrl -マウスをドラッグするときShift/Ctrlキーを押していると1または2が渡される。
startPoint - マウスドラッグ開始点
処理:
getSegmentModifiers メソッドを呼んで、 その戻り値をsegmentModifiers フィールドにセットする。
SegmentModifier.getHitSegmentModifier メソッドを呼んで、その戻り値を hitSegmentModifier フィールドにセットする。
create public void create(Point2D[] points)
何もしない。
moveEndPoint public void moveEndPoint(int ctrl, int movePtIndex, Point2D currentPoint)
現在のバージョンでは何もしない。
moveEndPoint public void moveEndPoint(int ctrl, int movingPoint, Point2D oldPoint, Point2D currentPoint)
引数:
ctrl - マウスをドラッグするときShift/Ctrlキーを押していると1/2の値が渡される。
movePtIndex - 動かす点の識別子、0ならば始点、1ならば終点
oldPoint - 一回前のドラッグ点。
currentPoint - 現在のドラッグ点。
処理:
MoveResizeShapeLSのmouseDraggedから呼ばれる。
このメソッドは折れ線の場合と異なり、回転と拡大/縮小変換で図形要素を変換する。 変換マトリックスはMatrix2D.getRotationMatrixメソッド で作成する。
modify public void modify(int ctrl, Point2D oldPoint, Point2D currentPoint)
引数:
ctrl - マウスをドラッグするときShift/Ctrlキーを押していると1/2の値が渡される。
oldPoint - 一回前のドラッグ点。
currentPoint - 現在のドラッグ点。
処理:
ModifyShapeLS.mouseDraggedから呼ばれる。
• 実際の処理はSegmentModifierのstaticメソッド modifyで実行される。
modifyPoint public void modifyPoint(Point2D point, String command)
引数:
point - 処理する点
command - "add_point"/ "delete_point"/ "smooth"/ "cusp"/ "disconnect"
処理
• ModifyShapeLS.mouseClickedから呼ばれ、節点を追加する。
• 引数のpointはクリック点で、ModifyShapeLS.mouseClickedから渡される。
• 実際の処理はSegmentModifierのstaticメソッドで実行する。
引数commandの値に応じて次のstaticメソッドを呼び出す。

SegmentModifier.addPoint
SegmentModifier.deletePoint
SegmentModifier.smoothPoint
SegmentModifier.cuspPoint
SegmentModifier.disconnectPoint

clone public abstract Object clone()
図形要素のクローンを作成して返す。
toString public abstract String toString()
図形要素の文字列表現を返す。


11. GroupElement(グループ要素)クラス 戻る=>page top
public class GroupElement extends ShapeElement
ShapeElementの拡張クラス。
グループ図形はGroupElementに子要素(ShapeContainer)へのリンクを持たせる。 グループ図形をさらにグループ化することもあるので、次の図のような階層構造になる。 Groupはグループ図形、Elementは単一図形ContainerListContainerManagerが管理する1ページ分の図形データのリストである。
ここでElementはRectangleElement, RoudRectangleElement, PolylineElement..など単一図形要素を持つShapeContainerを表し、 GroupはGroupElementを持つShapeContainerを表している。


図11.1 グループ図形


フィールド変数には子要素のリストを追加する。図形データを持たないのでほとんどが無効なメソッドである。

フィールド 説明
childrenList private ArrayList childrenList
子要素(ShapeContainer)を格納するリスト。子要素はクループ図形でも良い。

メソッド 説明
getTypeE public int getTypeE()
Command.GROUPを返す。
getShapeIdString public String getShapeIdString()
"Group"を返す。
isClosed public boolean isClosed():falseを返す。
getShape public Shape getShape():nullを返す。
getCurve2D public Curve2D getCurve2D():nullを返す。
setCurve2D public void setCurve2D(Curve2D curve2D):なにもしない
getSerializableCurve2D public SerializableCurve2D getSerializableCurve2D():nullを返す。
setSerializableCurve2D public void setSerializableCurve2D(SerializableCurve2D curve2D) :何もしない。
getBoundingBox public Rectangle2D getBoundingBox()
・図形要素を囲むBoundingBoxを返す。図形要素のタイプに依存するメソッド。
ShapeContainerやGroupcontainerにも同名のメソッドがある。 ShapeContainerのgetBoundingBoxはこのメソッドの戻り値をそのまま返し、 GroupcontainerのgetBoundingBoxはGroupElement.getBoundingBoxで所属する図形要素のBoundingBoxを全て囲むBoundingBoxを作って返す。 いずれにしろこのメソッドがベースとなっている。
getEndPTs public Point2D[] getEndPTs():長さ0の配列を返す。
createTextArea public Rectangle2D createTextArea():nullを返す。
getSegmentModifiers public SegmentModifier[] getSegmentModifiers():nullを返す。
getModifierPTs public Point2D[] getModifierPTs():長さ0の配列を返す。
mouseStart
(override)
public void mouseStart(int ctrl, Point2D startPoint)
このメソッドは ShapeElement.mouseStartをオーバーライドする。
引数:
ctrl - 1 or 2 (with holding down the Shift or Ctrl key).
startPoint - The start point of the mouse drag.
処理:
Calls the mouseStart method of each child shape element.
create public void create (Point2D startPoint, Point2D currentPoint):何もしない。
create public void create(Point2D[] points):何もしない。
create public void create(Rectangle2D boundingBox):何もしない。
move
(override)
public void resize(Rectangle2D oldBox, Rectangle2D newBox)
このメソッドはShapeElement.move メソッドをオーバーライドする。
グループに含まれている非グループ要素をgetGroupedSingleShapeContainers で取得し、 各要素のmoveResizeメソッドを使ってを移動する。
resize
(override)
public void resize(Rectangle2D oldBox, Rectangle2D newBox)
このメソッドはShapeElement.resize メソッドをオーバーライドする。
グループに含まれている非グループ要素を getGroupedSingleShapeContainers で取得し、 各要素のmoveResizeメソッドを使ってを移動する。
moveResize
(override)
public void resize(Rectangle2D oldBox, Rectangle2D newBox, boolean resizeTextBox)
このメソッドはShapeElement.resize メソッドをオーバーライドする。
グループに含まれている非グループ要素を getGroupedSingleShapeContainers で取得し、 各要素のmoveResizeメソッドを使ってを移動する。
resize public void resize(Rectangle2D oldBox, Rectangle2D newBox)
getGroupedSingleShapeContainersメソッドでグループ要素に属する全ての 単一図形を取り出しリサイズを行う。
moveEndPoint public void moveEndPoint(int ctrl, Point2D oldPoint, Point2D currentPoint):何もしない。
getChildrenList
(proprietary)
public ArrayList getChildrenList()
グループの子要素リストを返す。
setChildrenList
(proprietary)
public void setChildrenList(ArrayList childrenList)
子要素リストを設定する。
getChildren
(proprietary)
public ShapeContainer[] getChildren()
グループ直下の子要素を配列で返す。
addChildren
(proprietary)
public void addChildren(ShapeContainer container)
子要素をグループに追加する。
getGroupedContainers
(proprietary)
public ShapeContainer[] getGroupedContainers()
このグループ要素の下位に存在する全ての子要素を再帰的に検索して配列で返す。次の同名メソッドを呼ぶ。
getGroupedContainers
(proprietary)
protected void getGroupedContainers(Vector vector)
このグループ要素の下位に存在する全ての子要素を再帰的に検索してvectorに格納する。
getGroupedSingleShape
Containers

(proprietary)
public ShapeContainer[] getGroupedSingleShapeContainers()
このグループ要素の下位に存在する図形データを持つ全ての子要素を再帰的に検索して配列で返す。 次の同名メソッドを呼ぶ。
getGroupedSingleShape
Containers

(proprietary)
protected void getGroupedSingleShapeContainers(Vector vector)
このグループ要素の下位に存在する図形データを持つ全ての子要素を再帰的に検索してvectorに格納する。
clone public Object clone():何もしない
toString public String toString()
文字列表現を返す。




Copyright (c) 2009-2013
All other trademarks are property of their respective owners.