Java Drawing DrawTop

Language

JP  US  UK

 

図形コンテナ

 H. Jyounishi, Tokyo Japan
 

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

要旨:ShapeContainerは種々の図形要素を格納する容器である。 ShapeContainerがグループ図形でなければ、直線、折れ線、矩形など基本図形要素を持たせる。 グループ図形の場合は、グループ要素(GroupElement) を持たせ、グループ要素にグループに所属する基本図形要素オブジェクトを持たせる。
このページで説明するクラス: ShapeContainer

1. 概要
1.1 ShapeContainerの構成
・ShapeContainerは種々の図形要素を格納する容器であり、図形要素に共通するメソッドを提供する。
 これらのメソッドは図形要素のクラスに持たせることもできるが、数が多いので、現在のところこのクラスに持たせている。
・ShapeContainerにグループ要素(GroupElement)を持たせることにより、グループ図形を表すことができる。
・ShapeContainerには必ず描画スタイルを決めるPaintStyleオブジェクトを持つ。 またTextBoxを持つこともできる。


図1 ShapeContainerクラスの構成
: shape element=> ShapeElement, Parametric curve=> Curve2D


1.2 単一図形とグループ図形

(a) サンプル図形
Round_Rectangle(No-0), Rectangle(No-4)などグレイの小文字は 図形コンテナの図形名称(shapeId)を表す。


(b) 部品 - グループ図形


(c) ContainerListの構成
∙ グループ図形: Group(No-0), Group(No-1)などはグループ図形で、その他は単一図形(Single shape)である。
∙ グループ図形の子要素: グループ図形要素childrenList(ArrayList)に格納する。
(c)ではchildrenListから子要素へのリンクを矢印で表している。

図2. 単一図形とグループ図形


1.3 図形オブジェクトの描画
オブジェクト
説明
図形要素
DrawShapeUtil.drawShapeElement メソッドを呼んで図形要素を描画する。
図形要素がグループ要素の場合、 グループ要素に含まれるShapeContainerの drawShapeメソッドを再帰的に呼び出して描画する。
TextBox
ShapeContainerに含まれるTextBoxオブジェクトを取り出し、 TextBox.drawTextBoxメソッドを呼んで行がする。
選択ボックス、リサイズハンドル
図形要素が線分の場合、DrawShapeUtil.drawLineSelectionメソッドを 呼んで描画する。線分以外の場合、DrawShapeUtil.drawSelectionメソッドを 呼んで描画する
∙ 線分:端点にリサイズハンドルを描画(図5).
∙ その他:選択ボックスとリサイズハンドルを描画(図3)。 もし図形要素が閉じていない折れ線、三次曲線の場合、リサイズハンドルをそれらの図形の端点に描画する (図5)。
: 選択ボックスの線幅とリサイズハンドルの大きさは、拡大率によらず一定になるように描画する ()。
制御点、接線ベクトル DrawShapeUtil.drawSegmentModifiersメソッドを呼んで描画する。
制御点、接線ベクトルは、図形の形状を修正するために使われる。
=> Modifying shape図1.2図1.3図1.4参照
折れ線、三次曲線のセグメント接続点
セグメント接続点はセグメント接続点とも呼ばれる。 DrawShapeUtil.drawNodeMarkメソッドを 呼んでセグメント接続点を描画する(図6).

図3 選択ボックスとリサイズハンドル

倍率=100% S倍率=144% 倍率=173%

図4 選択ボックスの線幅とリサイズハンドルのサイズ




(a)端点でのリサイズハンドル



(b)選択ボックスとリサイズハンドル
もし図形の輪郭線が閉じていなければ端点に
リサイズハンドルを描画する。

図5. リサイズハンドル



図6. セグメント接続点


2. ShapeContainerクラス 戻る=>page top
public class ShapeContainer
フィールド 説明
shapeId
private String shapeId
図形要素のキーワードとContainerManagerのシリアルナンバで作る識別子。
:
(a)ShapeContainerのcloneには元の識別子がついている。子要素も同様。
(b)ShapeContainerの図形要素を入れ替えた場合、shapeIdの図形要素キーワード部分が変わるが、シリアル番号は変わらない。
上記(a), (b)についてはContainerManagerContainerListに書き込む前に新しいshapeIdを設定すること。 新しいshapeIdは、このクラスのsetNewShapeIdメソッドで取得できる。
: shapeId => "Rectangle(No-1)", "Round_Rectangle(No-2)", "Ellipse(No-3)", "Image(No-4)", "Line(No-10)", "Polyline(No-11)", "CubicCurve(No-12)", "GeneralCurve(No-13)", "Group(No-14)" など。
containerIndex
protected int containerIndex
ShapeContainerを格納するContainerListのindex番号(ArrayList内の番号)。ContainerListの先頭から順にShapeContainerを取り出して画面に描画するので、index番号が小さければ画面の奥に描画される。
ContainerManageraddXXX, getXXX, deleteXXXなどの操作のたびに、ContainerManager.setContainerIndexメソッドを呼んで、ShapeContainerのこのフィールドを更新する。
参照 => ContainerListのindex
parent
private ShapeContainer parent
この図形がグループ図形の子要素であるとき、親オブジェクトを設定する。
element
public ShapeElement element
図形要素オブジェクトを設定。
textBox
public TextBox textBox
TextBox を持つとき、TextBoxオブジェクトを設定。textBox=nullの場合TextBox を持たない。
paintStyle
PaintStyle paintStyle
PaintStyleオブジェクトを設定。PaintStyleオブジェクトはコンストラクタで作成する。paintStyle=nullはあり得ない。
property

public HashMap<String, Object> property = new HashMap<String, Object>()

補助情報を格納する。補助情報が必要になるたびにフィールド変数を増やすのは面倒なので、 このHashMapを利用する。現在使っている補助情報 (プロパティ)は次。

key value (object)
ORIGINAL_TYPE string - RECTANGLE, ROUND_RECTAGGLE etc.
ENABLE_RESIZING boolean true
KEEP_ASPECT_RATIO boolean false
KEEP_LINE_DIRECTION boolean false
KEEP_CONNECTOR_CONNECTIONS boolean true
ENABLE_UNGROUPING boolean true

=> 操作説明書 属性の設定された図形の振舞い

selected
private boolean selected
この図形が選択されている時true。
visible
private boolean visible
このShapeContainerの図形要素を表示するときtrue。
mode
protected int mode
このグループ図形のモード。モードを表す整数値はCommandクラスで定義してある。
Command.NORMAL_MODE/ CREATING_MODE/ MOVING_MODE/ RESIZING_MODE/ MOVING_ENDPT_MODE/ MODIFYING_SHAPE_MODEなど。
changeCode
private int changeCode
これはundoを設定するために使い、ShapeContainerに変更があったときに設定する。-1でなければ変更があったことを示す。 設定するコードはUndoConstants>で定義。
connectorTargetPermission
private boolean connectorTargetPermission
コネクターの接続を許す図形のときtrue。
connectorPermission
private boolean connectorPermission
コネクターの資格を持つときtrue。但しコネクターとなり得る図形要素は直線、折れ線だけなので、このフィールドがtrueでも、 それ以外の図形要素ならば、問い合わせメソッドisConnectorでfalseを返す。
SHAPE
public static int SHAPE
単一図形のShapeContainerであることを示す定数。
GROUP
public static int GROUP
グループ図形のShapeContainerであることを示す定数。

メソッド
説明
コンストラクタ
public ShapeContainer()
PaintStyleオブジェクトを作成し設定する。
getContainerType
public int getContainerType()
単一図形を格納するShapeContainerのときShapeContainer.SHAPEを返す。グループ図形のときShapeContainer.GROUP を返す。
getShapeId
public String getShapeId()
フィールド変数shapeIdを返す。
setShapeId
public void setShapeId(String shapeId)
フィールド変数shapeIdに設定。
このメソッドは SerializableElementUtil オブジェクトと、 ContainerManager.backup メソッドだけから呼ばれる。
setNewShapeId
public void setShapeId(ContainerManager manager, boolean withChildren)
引数:
manager - ContainerManager オブジェクト.
withChildren - trueでかつこのオブジェクトがグループならば、 このオブジェクトの子図形(ShapeContainer)にも新しいshapeIdを設定する。
処理:
shapeIdを作成し shapeId に設定する。
図形のシリアル番号を ContainerManager.getUniqueSerialNumber で取得し、configureShapeIdを呼んでshapeIdを作成する。
configureShapeId
private String configureShapeId(int number)
引数:
number - シリアル番号
戻り値:
shapeIdを返す。
処理:
ShapeElement.getShapeIdStringの戻り値と、 引数 numberからshapeIdを構成し戻り値で返す。
getSerialNumber public int getSerialNumber()
戻り値:
ContainerManager.getUniqueSerialNumberメソッドで生成されたシリアル番号を返す。
Processing;
shapeIdからシリアル番号を取り出す。
getSerialNumber
(static)
public static int getSerialNumber(String shapeId)
引数:
shapeId - The shape id.
戻り値:
ContainerManager.getUniqueSerialNumber メソッドで生成されたシリアル番号を返す。
処理;
shapeIdからシリアル番号を取り出す。
getContainerIndex public int getContainerIndex()
フィールド変数containerIndexを返す。
setContainerIndex public void setContainerIndex(int containerIndex)
フィールド変数containerIndexに設定。
getParent
public ShapeContainer getParent()
グループに所属する場合、親オブジェクト(フィールド変数parent)を返す。
setParent
public void setParent(ShapeContainer parent)
親要素を設定する。グループ化のメソッドContainerManager.groupで設定する。
getTopParent
public ShapeContainer getTopParent()
このオブジェクトの親がなければこのオブジェクトを返す。そうでなければ親のgetParentメソッドを再帰的に呼び出し最上位の親を返す。
getElement
public ShapeElement getElement()
このShapeContainerの図形要素(フィールド変数element)を返す。
setElement
public void setElement(ShapeElement element)
このShapeContainerに図形要素を設定する。
getMode
public int getMode()
このShapeContainerの動作モードを返す。
setMode
public void setMode(int mode)
NORMAL_MODE, CREATING_MODE, MOVING_MODE, RESIZING_MODE, MODIFYING_SHAPE_MODEのいずれかを設定。
モード定数はCommandクラスで定義。
setSelected
public void setSelected(boolean selected)
この図形に選択状態(フィールド変数selected)を設定する。
selected=falseで呼ばれたときactivated=trueならば、activated=falseにする。
isSelected
public boolean isSelected()
この図形が選択されているときtrueを返す。
setVisible public void setVisible(boolean visible)
表示の可否(フィールド変数visible)を設定する。
isVisible public boolean isVisible()
表示の可否を返す。
isClosed public boolean isClosed()
閉図形の場合、trueを返す。図形要素のメソッドを呼ぶ。
isEditableTextBox
public boolean isEditableTextBox()
現在のところ、TextBoxを持ち、テキスト入力可能な場合にtrueを返す。
makeTextBoxEditable
public void makeTextBoxEditable(boolean activate)
activateがtrueならばこの図形が持つTextBoxをテキスト入力・編集可能な状態にする。
TextBox.activateMouseListener でTextBoxをマウスリスナー、マウスモーションリスナーとしてListenerPanelにセットする。
makeTextBoxEditable public void makeTextBoxEditable(Point2D point, int ctrl)
引数:
point - マウスでクリックした点。.
ctrl - 0/1/2
マウスクリック時にShift/Ctrlキーを押しているとctrl には1/2が設定される。
処理:
図形のテキスト領域をクリックしたときにSelectionLS.execSelectionから呼ばれる。
・この図形が持つTextBoxをテキスト入力・編集可能な状態にする。
・Point2D pointの指す位置にTextBoxのキャレットを表示する。
TextBox.mouseClickedと同じロジックで、次のメソッドを使って処理する。
TextBox.getCaretPositionAtMouse
TextBox.setCaretPositionOrSelection
getChangeCode
public int getChangeCode()
このオブジェクトがグループでなければフィールド変数changeCodeを返す。グループの場合、子オブジェクトのchangeCode(>=0)を返す。
setChangeCode
public void setChangeCode(int code)
フィールド変数changeCodeに引数を設定する。
resetChangeCode
public void resetChangeCode()
フィールド変数changeCodeをリセットする(-1をセットする)。
setProperty public void setProperty(String key, Object object)
引数:
key - プロパティ(属性)キー
object - プロパティ(属性)値
=>property
処理:
この図形のプロパティを設定する。
getProperty public Object getProperty(String key)
引数:
key - プロパティ(属性)キー
戻り値:
プロパティキーの値を返す。
removeProperty public void removeProperty(String key)
引数:
key - プロパティ(属性)キー
Processing:
プロパティをpropertyから削除する。
getBooleanProperty public boolean getBooleanProperty(String key)
戻り値:
キーの値を返す。
getPaintStyle public PaintStyle getPaintStyle()
フィールド変数paintStyleを返す。
setPaintStyle public void setPaintStyle(PaintStyle paintStyle)
フィールド変数paintStyleに引数を設定する。
getColors public Color[] getColors()
このオブジェクトのPaintStyleオブジェクトとTextBoxのCommittedTextContainerオブジェクトに設定されている全ての色情報を配列で返す。
hasTextBox public boolean hasTextBox()
TextBoxを持つときtrueを返す。
addTextBox public int addTextBox()
戻り値:
0 - 正常終了。
1 - グループのためテキストボックスは付加されなかった。
2 - 図形要素の種類が異常=>バグ。
3 - 図形要素が閉図形ではない。
4 - すでにテキストボックスを持っている。
5 - テキストエリアが確保できない=>バグ。
6 - 作成したテキストエリアが小さすぎる(幅または高さが10ピクセル以下)。
処理:
このShapeContainerオブジェクトに新規作成のTextBoxオブジェクトを追加する。 TextBoxオブジェクトのテキスト領域(textArea: Rectangle2D)を ShapeElement.createTextArea抽象(abstract)メソッドを呼んで 取得し、次のようにTextBoxに設定する。
newTextBox.setTextArea(textArea);
=> 操作説明書 テキストボックス作成、追加、削除
addTextBox public void addTextBox(Rectangle2D textArea)
引数:
textArea -新しいTextBoxオブジェクトを配置する矩形。
処理:
このメソッドはSerializableElementUtilだけから呼ばれる。ファイルから読み込んだデータ、クリップボードにストアしたSerializableElementデータからShapeContainer全体を再構成する場合に使う。
deleteTextBox public int deleteTextBox() textBox フィールドにnullを設定する。
getTextBox public TextBox getTextBox()
TextBoxオブジェクトを返す(フィールド変数textBoxを返す)。
setTextBox public void setTextBox(TextBox textBox)
このShapeContainerにTextBoxオブジェクトを設定する。
setConnectorTarget
Permission

public void setConnectorTargetPermission(boolean permission)
コネクターの接続を許すか否かを設定する。
現在使用していない。
setConnectorPermission
public void setConnectorPermission(boolean permission)
コネクター図形であるか否かを設定する。直線、折れ線だけにtrueを設定できる。
CutShapeでfalse設定。 MoveResizeShapeLSで直線、折れ線を動かす時にtrue設定。
他では使用していない。
isConnectorTarget
public boolean isConnectorTarget()
このShapeContainerがコネクターの接続を許す図形のときtrueを返す。
isConnector
public boolean isConnector()
このShapeContainerがコネクター図形のときtrueを返す。
compare
public boolean compare(ShapeContainer container)
このオブジェクトが引数containerに等しいときtruを返す。
compare
public boolean compare(ShapeContainer[] containers)
このオブジェクトが引数containersにのどれかに等しいときtruを返す。
getGroupedContainers
public ShapeContainer[] getGroupedContainers()
処理:
このShapeContainerが単一図形ならば、このShapeContainerを返す。
このShapeContainerがグループ図形ならば、このShapeContainerと子要素のShapeContainerを全て返す。 全ての子要素はGroupElement.getGroupedContainersメソッド で検索できる
(例) GroupElement.getGroupedContainersメソッド:

もしこのShapeContainerオブジェクトが図2の"Single shape 0"ならば、"Single shape 0"を返す。 もしこのShapeContainerオブジェクトが"Group 0"ならば、Group 0", "Group 1", "Single shape 3", "Single shape 4", "Single shape 2"を返す

getGroupedSingleShape
Containers

public ShapeContainer[] getGroupedSingleShapeContainers()
このShapeContainerが単一図形ならば、このShapeContainerを返す。
このShapeContainerがグループ図形ならば、このShapeContainerと子要素のうちグループ図形でないShapeContainerを全て返す。
getGroupedTextBoxes
public TextBox[] getGroupedTextBoxes()
このShapeContainerおよび子要素のShapeContainerからTextBoxを全て取り出す。
TextBoxを取り出す処理を、単一図形とグループ図形で共通化するためのメソッド。
getGroupedTextBox
public TextBox getGroupedTextBox(String shapeId)
このShapeContainerおよび子要素のShapeContainerからshapeIdを持つShapeContainerを選びそのTextBoxを返す。
TextBoxを取り出す処理を、単一図形とグループ図形で共通化するためのメソッド。
getGroupedPaintStyles
public PaintStyle[] getGroupedPaintStyles()
このShapeContainerおよび子要素のShapeContainerからPaintStyleを全て取り出す。
PaintStyleを取り出す処理を、単一図形とグループ図形で共通化するためのメソッド。
getGroupedPaintStyle
public PaintStyle getGroupedPaintStyles(String shapeId)
このShapeContainerおよび子要素のShapeContainerからshapeIdを持つShapeContainerを選び、そのPaintStyleを返す。 PaintStyleを取り出す処理を、単一図形とグループ図形で共通化するためのメソッド。
getBoundingBox
public Rectangle2D getBoundingBox()
この図形を囲むボックスを返す。図形要素のgetBoundingBoxを呼ぶ。
setTextBoxLayout
public void setTextBoxLayout(Insets textBoxInsets, int textAlign, double lineSpace)
引数:
textBoxInsets - TextBoxとテキスト領域の間の余白
textAlign - 右寄せ/中央寄せ/左寄せ
lineSpace - 行間隔
処理:
このShapeContainerのTextBoxの属性を設定する。このShapeContainerがグループ図形ならば、子要素の全てに設定する。TextBox のsetTextBoxLayoutメソッドを呼ぶ。
setFillColor
public void setFillColor(Color fillColor)
このShapeContainerの塗つぶし色を設定する。このShapeContainerがグループ図形ならば、子要素の全てに設定する。
PaintStyleの同名メソッドを呼ぶ。
setLineColor
public void setLineColor(Color lineColor)
このShapeContainerの輪郭線の色を設定する。このShapeContainerがグループ図形ならば、子要素の全てに設定する。
PaintStyleの同名メソッドを呼ぶ。
setLineWidth
public void setLineWidth(String lineWidth)
このShapeContainerの輪郭線の色を設定する。このShapeContainerがグループ図形ならば、子要素の全てに設定する。
PaintStyleの同名メソッドを呼ぶ。
setLineStroke
public void setlineStroke(String lineStroke)
このShapeContainerの輪郭線の線種を設定する。このShapeContainerがグループ図形ならば、子要素の全てに設定する。
PaintStyleの同名メソッドを呼ぶ。
setArrowStyle
public void setArrowStyle(String arrowStyle)
このShapeContainerが矢印を付けられる直線/曲線のとき、端点の矢印の形を指定する。 このShapeContainerがグループ図形ならば、子要素の全てに設定する。
PaintStyleの同名メソッドを呼ぶ。引数の意味はPaintStyleのarrowStyle>参照。

public void drawShape(Graphics g)
このShapeContainerの図形要素、TextBoxなど全ての図形を対応するクラスのメソッドを呼んで描画する。
呼び出すクラスとメソッドは次の通り。
・図形要素:DrawShapeUtil.drawShapeElement
・TextBox:TextBox.drawTextBox
・図形要素変形の制御点:MODIFYING_SHAPE_MODEのとき DrawShapeUtil.drawSegmentModifiersを呼ぶ。
・選択ボックス、リサイズハンドル:DrawShapeUtil.drawSelection
clone
public Object clone()
このShapeContainerのクローンを作る。クローン図形のshapeIdは元のShapeContainerと同じ。
このShapeContainerに付随するTextBox、PaintStyleなど全てクローンを作る。
このShapeContainerがグループ図形でも可。
toString
public String toString()
このShapeContainerの文字列表現を返す。
toShortString
public String toShortString()
このShapeContainerの短い文字列表現を返す。



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