1. 概要
(1) SerializableElement
SerializableElementクラスは、図形コンテナ(ShapeContainer)とそれにリンクするShapeElement、textBox、PaintStyleオブジェクトのフィールドをまとめたクラスで、java.io.Serializableインターフェイスをインプリメントしている。メソッドはtoStringなど簡単なものだけをインプリメントする。
SerializableElementオブジェクトはファイル書き込み、
読み出し可能でありファイルWrite/Readメソッドをインプリメントする。
(2) ShapeContainer関連クラス
ShapeContainerからリンクされる
Curve2D,
Segment2D,
java.text.AttributedStringクラスもそれぞれjava.io.Serializableインターフェイスをインプリメントした
SerializableCurve2D,
SerializableSegment2D,
SerializableAttributedStringを用意し、
それぞれのファイルWrite/Readメソッドをインプリメントする。
(3) 他機能での利用
SerializableElementオブジェクトはデータだけからなる
コンパクトなオブジェクトなので、次の処理にも使っている。
∙ 図形の編集(Cut,Copy and Paste)操作でクリップボードに
書き込むデータとして利用する。
∙ Undo, Redo操作のためコマンド実行前と実行後の図形の状態を記録
(UndoableDrawEditで記録) するデータとして利用する。
またUndo, Redo操作のため、SerializableTextBox、
SerializablePaintStyleクラスを用意している。
これらはTextBoxの変更、PaintStyleの変更を記録するために使用し、ファイルへの書き込みには使っていない。
=>
UndoableDrawEdit.ChangeTextBox,
UndoableDrawEdit.ChangePaintStyle
2. SerializableElementクラス
戻る=>page top
public class SerializableElementimplements Serializable
ShapeContainerとその下位クラスから、
フィールド変数だけを取り出したデータだけのクラス。ShapeContainerが
単一図形の場合は簡単だが、
グループ図形の場合は
SerializableElementをグループ図形を表すので面倒である。ShapeContainerの場合と同様、
グループ図形のSerializableElementを図2.1(e)のようにツリー構造で表す。
このためフィールド変数のchirdrenList(ArrayList)に
子要素のSerializableElementを格納することでツリー表現にする。
(a)元の図形 |
(b)2図形のグループ化 |
(c)グループ図形と楕円図形のグループ化 |
(d)(c)のグループ図形と上の星形図形のグループ化 |
(e)上記(d)のグループ図形のツリー構造表示 |
図2.1 グループ図形
のSerializableElement
メソッド
|
説明
|
getGroupedElements
|
public SerializableElement[] getGroupedElements()
引数:
このオブジェクトが単一図形の場合は自分自身を返す。
グループ図形の場合は、自分自身と子要素を全て返す。
図2.1 (d), (e)のグループ図形の場合には、Group(No-6), Group(No-5), Group(No-4), Rectangle(No-0), Round_Rectangle(No-1),
Ellipse(No-2)のSerializableElementを配列で返す。
処理:
次のgetGroupedElementsEメソッドを呼ぶ。
|
getGroupedElementsE |
public void getGroupedElementsE(Vector vector)
引数:
vector - 子要素を格納するArrayList。
処理:
再帰的にgetGroupedElementsEを呼んで図2.のツリーを探索し、すべての子要素をvectorに格納して返す。
|
getGroupTreeDepth |
public int getGroupTreeDepth(String shapeId)
This method is used to indent the print out of a child SerializableElement object.
=>
図2.2
引数:
shapeId - 図形の識別子(内部名称)
戻り値:
このオブジェクトが単一図形の場合は自分自身を返す。
グループ図形の場合は、自分自身と子要素を全て返す。
図2..1 (e).のグループ図形の場合には、Group(No-6), Group(No-5), Group(No-4), Rectangle(No-0), Round_Rectangle(No-1),
Ellipse(No-2)のSerializableElementを配列で返す。
処理:
次のgetGroupTreeDepthEメソッドを呼ぶ。
|
getGroupTreeDepthE |
public void getGroupTreeDepthE(Vector vector)
引数:
vector - shapeId(String), treeDepth(Integer), findDepth(Integer)を格納する。
∙ treeDepth - 現在探索中のツリー階層での深さ(作業用)。
∙ findDepth - shapeIdも持つ子要素の階層での深さ。検出できなかった場合-1を返す。
処理:
このメソッドを再帰的に呼んで図2.1 (e)のツリーを探索する
|
clone |
public Object clone()
このオブジェクトのクローンをObject型で返す。
|
cloneHashMap |
private HashMap<String, Object> cloneHashMap(HashMap<String, Object> hashMap)
このオブジェクトのHashMapフィールド変数のクローンを返す。
|
toString
|
public String toString()
getGroupTreeDepth メソッドでインデント数(4スペース単位)を決め、header文字列を決めてtoStringEメソッドを呼ぶ。
=>図2.2
|
toStringE |
private String toStringE(int indent, String header)
このオブジェクトの文字列表現を返す。
|
toShortString
|
public String toShortString()
toStringメソッドと同様、インデント数とheader文字列を決めて次のtoShortStringEメソッドを呼ぶ。
=>図2.2
|
toShortStringE |
private String toShortStringE(int indent, String header)
このオブジェクトの短い文字列表現を返す。
|
toVeryShortString
|
public String toVeryShortString()
toStringメソッドと同様、インデント数とheader文字列を決めて次のtoVeryShortStringEメソッドを呼ぶ。
=>
図2..2
|
toVeryShortStringE |
private String toVeryShortStringE(int indent, String header)
このオブジェクトの最小限の文字列表現を返す。
|
図2.2 (e)のグループ図形をtoString(), toShortString(), toVeryShortString()でプリント
|
3. SerializableCurve2Dクラス
戻る=>page top
public class SerializableCurve2D implements Serializable
Curve2Dクラスから、図形データ(フィールド変数)部分だけを取り出したクラス。
∙ SerializableCurve2Dへの変換、逆変換メソッド:Curve2Dクラス(Rectangle2DE、Polyline2DEなど)にインプリメントする。
∙ SerializableCurve2Dのファイル入出力メソッド:これも簡単なのでSerializableShapeUtilのような別クラスを用意せず、このクラスにインプリメントする。
フィールド
|
説明
|
type
|
public int type
パラメトリック曲線のタイプ。Curve2D.RECTANGLE/ROUND_RECTANGLE/ELLIPSE/LINE...など。
|
doubleData
|
public double[] doubleData
パラメトリック曲線の補助データの配列。現在使用していない。
|
points
|
public Point2D[] points
パラメトリック曲線の補助データ。現在使用していない。
|
serializableSegment2D
|
public SerializableSegment2D[] serializableSegment2D
パラメトリック曲線を構成する曲線セグメントのSerializableデータ(SerializableSegment2D)を格納する配列。
|
versions
|
public static final String[] versions
バージョンの文字列を入れた配列。最初のバージョンは"ver0.0"。
その時のバージョンに応じてversions[i]をファイルの最初に書き込む。
|
メソッド
|
説明
|
setSegments
|
public void setSegments(SerializableSegment2D[] serializableSegments)
フィールド変数serializableSegmentsに引数を設定。
|
getSegments
|
public SerializableSegment2D[] getSegments()
フィールド変数serializableSegmentsを返す。
|
writeSerializable
Curve2D
|
public static int writeSerializableCurve2D(ObjectOutputStream out, SerializableCurve2D
sCurve2D) throws Exception
∙ 最初にversionの文字列を書き込む。
∙ SerializableCurve2Dのフィールド変数を順にファイルに書き込む。
SerializableSegment2DオブジェクトはSerializableSegment2Dの書き込みメソッドを使ってを書き込む。
|
readSerializable
Curve2D
|
public static SerializableCurve2D readSerializableCurve2D(ObjectInputStream
in) throws Exception
∙ SerializableCurve2Dオブジェクトを作成して、そのフィールドにファイルから読んだデータを設定する。
SerializableSegment2Dオブジェクトは、SerializableSegment2Dの読み込みメソッドを使ってを読み込み。
|
4. SerializableSegment2Dクラス
戻る=>page top
public class SerializableSegment2D implements Serializable
これはSegment2Dのフィールド変数だけを取り出したクラス。
フィールド
|
説明
|
type
|
public int type
曲線セグメントの種類を表す。staticな定数LINE, ARC, Bezierのいずれかをセット。
|
shape
|
public Shape shape
typeに応じてjava.awt.geomパッケージのLine2D, Arc2D, CubicCurve2Dオブジェクトをセット。
|
affineTransform
|
public AffineTransform affineTransform
AffineTransformを設定する。
=>
Segment2D.affineTransform
|
versions
|
public static final String[] versions
バージョンの文字列を入れた配列。最初のバージョンは"ver0.0"。
その時のバージョンに応じてversions[i]をファイルの最初に書き込む。
|
メソッド
|
説明
|
writeSerializable
Segment2D
|
public static int writeSerializableSegment2D(ObjectOutputStream out, SerializableSegment2D
sSegment2D) throws Exception
∙ 最初にversionの文字列を書き込む。
∙ SerializableSegment2Dのフィールド変数を順にファイルに書き込む。
|
readSerializable
Segment2D
|
public static SerializableSegment2D readSerializableSegment2D(ObjectInputStream
in) throws Exception
∙ SerializableSegment2Dオブジェクトを作成して、そのフィールドにファイルから読んだデータを設定する。
∙ 全てのデータを読み込んでSerializableSegment2Dオブジェクトオブジェクトが完成したら戻り値で返す。
|
5. SerializableAttributedString
戻る=>page top
public class SerializableAttributedString implements Serializable, Cloneable
java.text.AttributedStringはSerializableではないためファイルには書き込めない。このためファイル書き込み可能なSerializableAttributedStringクラスを用意する。
SerializableAttributedStringはAttributedStringUtilと同様な発想で、属性付き文字列をStringデータと属性付き区間(AttributedInterval)の集合で表す。
フィールド
|
説明
|
string
|
private String string
AttributedStringの文字列を設定する。
|
attributedIntervalList
|
public ArrayList attributedIntervalList
AttributedIntervalオブジェクトを格納したリスト。
|
versions
|
public static final String[] versions
バージョンの文字列を入れた配列。最初のバージョンは"ver0.0"。
その時のバージョンに応じてversions[i]をファイルの最初に書き込む。
|
メソッド
|
説明
|
コンストラクタ
|
public SerializableAttributedString(AttributedCharacterIterator iterator)
AttributedCharacterIteratorを渡してAttributedStringDataを作成する。
|
getString
|
public String getString()
フィールド変数stringを返す。
|
setString
|
public void setString(String str)
フィールド変数stringに引数を設定する。
|
getAttributedIntervalList
|
public ArrayList getAttributedIntervalList()
フィールド変数attributedIntervalListを返す。
|
setAttributedIntervalList
|
public void setAttributedIntervalList(ArrayList list)
フィールド変数attributedIntervalListに引数を設定する。
|
getAttributedString
|
public AttributedString getAttributedString()
AttributedStringを再構成する。
|
clone
|
public Object clone()
クローンを返す。
|
toString
|
public String toString()
文字列表現を返す。
|
writeSerializable
AttributedString
(static)
|
public static int writeSerializableAttributedString(ObjectOutputStream
out, SerializableAttributedString sAttributedString) throws Exception
∙ 最初にversionの文字列を書き込む。
∙ 引数sAttributedString=nullの場合には、フィールド変数のstringにnullを設定して書く。
この場合、attributedIntervalListは存在しないので書き込まない。
∙ 引数sAttributedString=nullではなく、フィールド変数string=nullでない場合
stringを書き込み、次にattributedIntervalListの各要素ごとにそのフィールド値を書き込む。
|
readSerializable
AttributedString
(static)
|
public static SerializableAttributedString readSerializableAttributedString(ObjectInputStream
in) throws Exception
∙ SerializableAttributedStringオブジェクトを作成して、そのフィールドにファイルから読んだデータを設定する。
∙ 最初にversionの文字列を読み込む。
∙ versionの次の文字がnullならば、戻り値としてnulを返す。
∙ versionの次の文字がnullでなければ、attributedIntervalListの各要素ごとにそのフィールド値を読み込み設定する。
SerializableAttributedStringオブジェクトが完成したら、戻り値で返す。
|
6. SerializableTextBox
戻る=>page top
public class SerializableTextBox implements Serializable
このクラスはファイル書き込みではなくて、undo設定で使う。
UndoDrawableEdit.ChangeTextBoxオブジェクトでTextBoxの変更を記録するために使う
フィールド
|
説明
|
shapeId
|
public String shapeId
図形(ShapeContainer)の識別子。
|
textArea
|
public Rectangle2D textArea
テキスト領域
|
attributedString
|
public SerializableAttributedString attributedString
TextBoxに表示する属性付き文字列のデータ
|
textBoxInsets
|
public Insets textBoxInsets
TextAreaの内側の余白。デフォールトはnew Insets(0, 0, 0, 0)。
|
textAlign
|
public int textAlign
左寄せ/中央/右寄せ(0/1/2)
|
lineSpace
|
public int lineSpace
文字の段落スペース
|
メソッド
|
説明
|
toString
|
public String toString()
文字列表現を返す。
|
7. SerializablePaintStyle
戻る=>page top
public class SerializablePaintStyle implements Serializable
このクラスはファイル書き込みではなくて、undo設定で使う。
フィールド
|
説明
|
shapeId
|
public String shapeId
図形(ShapeContainer)の識別子。
|
fillColor
|
public Color fillColor:図形の塗りつぶし色。
|
lineColor
|
public Color lineColor:図形の輪郭線、線の色
|
lineWidth
|
public float lineWidth:線幅。
|
dashedStyle
|
public String dashedStyle:線の種類。"solid", "squareDot", "dash"など。
|
dash
|
public float[] dash:点線のパターンを表すデータ。
|
arrowStyle
|
public int arrowStyle:コマンドパラメータで受け取った矢印描画スタイル(1-7)。
|
startArrowType
|
public int startArrowType:線の始点の矢印のタイプ:0/1/2
|
endArrowType
|
public int endArrowType:線の終点の矢印のタイプ:0/1/2
|
メソッド
|
説明
|
toString
|
public String toString()
文字列表現を返す。
|
8. SerializableElementUtilクラス
戻る=>page top
public class SerializableElementUtil
ShapeContainerからSerializableElementへ変換するメソッド、およびSerializableElementから
ShapeContainerへ逆変換するメソッドを集めたクラス。次の処理で使われる。
∙ Editing shape/text (cut/copy and paste)
∙ Undo, Redo
(a) グループ図形のShapeContainerオブジェクト構成
|
(b) (a)のShapeContainerオブジェクトをSerializableElementオブジェクトに変換し、親からのリンクを作成して出力する。 |
図8.1 グループ図形の場合のShapeContainerとSerializableElementのデータ形式
|
フィールド
|
説明
|
versions
|
public static final String[] versions
バージョンの文字列を入れた配列。最初のバージョンは"ver0.0"。
その時のバージョンに応じてversions[i]をファイルの最初に書き込む。
|
|