Java Drawing DrawTop

Language

JP  US  UK

 

ファイル書き込み用データ

 H. Jyounishi, Tokyo Japan
 

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

要旨:図形データをObjectOutputStreamで丸ごとファイルに書き込む方法だと、ShapeContainer、 ShapeElement、textBox、PaintStyleクラスに変更を加えると読めなくなる。データ(フィールド変数)ではなくメソッドの変更や所属パッケージを変更するだけでもダメである。この問題を解決するため図形データだけからなるクラスを用意し、そのフィールド変数をファイルに書き込む。フィールド変数は単純変数ではなくオブジェクトの場合もあるが、この場合はJava SEのクラスのオブジェクトになるまでオブジェクトをブレークダウンしてファイルに書き込む。
このページで説明するクラス: SerializableElement, SerializableCurve2D, SerializableSegment2D, SerializableAttributedString, SerializableTextBox, SerializablePaintStyle, SerializableElementUtil

1. 概要
(1) SerializableElement
SerializableElementクラスは、図形コンテナ(ShapeContainer)とそれにリンクするShapeElementtextBoxPaintStyleオブジェクトのフィールドをまとめたクラスで、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操作のため、SerializableTextBoxSerializablePaintStyleクラスを用意している。 これらは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



フィールド
説明
containerType
public int containerType
図形コンテナオブジェクト(ShapeContainer)のタイプ。
定数ShapeContainer.SHAPEまたはShapeContainer.GROUP。
containerIndex
public int containerIndex
ContainerManagerが管理する図形データのリスト(ContainerList)でのindex番号(リストの先頭から数えた番号)。
ShapeContainer.getContainerIndexメソッドで取得する。
parent
public String parent
ShapeContainerオブジェクトのparentフィールドを設定する。
shapeId
public String shapeId
ShapeContainerオブジェクトのshapeIdフィールドを設定する。
date
public Date date
このSerializableElementオブジェクトが作成されたときの日時を記録する。
fileNameAndPage
public String fileNameAndPage
このSerializableElementオブジェクトの元になるShapeContainerが格納されていたフィルパス名とページを文字型で記録する。"ファイルパス名:ページ"の形式。
(例)C:\Documents and Settings\jyou\My Documents\drawFileVer0.1\Component.draw:3
connectorTarget
Permission

public boolean connectorTargetPermission
ShapeContainerconnectorTargetPermissionフィールドを設定。
connectorPermission
public boolean connectorPermission
ShapeContainerconnectorPermissionフィールドを設定。
elementType
public String elementType
ShapeElenmentgetTypeメソッドの戻り値を表す文字列を設定する。
serializableCurve2D
public SerializableCurve2D serializableCurve2D
ShapeElement.curve2Dフィールドに設定されているパラメトリック曲線のSerializableCurve2Dオブジェクトを設定。
ShapeElement.getSerializableCurve2Dで取得する。
fillColor
public Color fillColor
PaintStylefillColorフィールドを設定。
lineColor
public Color lineColor
PaintStylelineColorフィールドを設定。
lineWidth
public float lineWidth
PaintStylelineWidthフィールドを設定。
dashedStyle
public String dashedStyle
PaintStyledashedStyleフィールドを設定。
dash
public float[] dash
PaintStyledashフィールドを設定。
arrowStyle
public int arrowStyle
PaintStylearrowStyleフィールドを設定。
startArrowType
public int startArrowType
PaintStylestartArrowTypeフィールドを設定。
endArrowType
public int endArrowType
PaintStyleendArrowTypeフィールドを設定。
線の終点の矢印のタイプ:0/1/2
textArea
public Rectangle2D textArea
TextBoxtextAreaフィールドを設定。
attributedString
public SerializableAttributedString attributedString
CommittedTextContainergetSerializableAttributedStringメソッドの戻り値を設定。
textBoxInsets
public Insets textBoxInsets
TextBoxtextBoxInsetsフィールドを設定。
textAlign
int textAlign
TextBoxtextAlignフィールドを設定。
lineSpace
int lineSpace
TextBoxlineSpace フィールドを設定。
imageByteData
public byte[] imageByteData
画像を表現するバイトデータ。java.awt.Imageやjava.awt.image.BufferedImageはSerializableではないからファイルに書き込めないので、バイトデータに変換して書き込む。変換はImageElement.getByteImageメソッドで行う。
childrenList
public ArrayList childrenList
ファイルに書き込むときはこのグループに属する子要素のshapeId(文字列)を格納する。但しファイルに書き込まずundo、copy&pasteで使う場合は子要素の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
Curve2
D

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]をファイルの最初に書き込む。

メソッド
説明
convertShapeContainer
(static)
public static SerializableElement convertShapeContainer(ShapeContainer container)
引数:
container - ShapeContainerオブジェクト。SerializableElementに変換される。
戻り値:
SerializableElementオブジェクトを返す。
引数containerが単一図形ならば、一つのSerializableElementオブジェクトを返す、 グループ図形ならばその子要素もSerializableElementに変換して返す。
処理:
containerをファイル書き込み可能なSerializableElementオブジェクトに変換するメインメソッド。
∙ containerが単一図形の場合はconvertSingleContainerを呼ぶ。
∙ containerがグループ図形の場合はconvertGroupContainerメソッドを呼ぶ。
図8.1(a)を(b)に変換する。
convertSingleContainer
(static)
public static SerializableElement convertSingleContainer(ShapeContainer container)
引数:
container - 単一図形のShapeContainerオブジェクト。
戻り値:
SerializableElementオブジェクトを返す。
処理:
単一図形のcontainerをSerializableElementオブジェクトに変換して返す。
convertGroupContainer
(static)
private static SerializableElement convertGroupContainer(ShapeContainer container)
引数:
container - グループ図形のShapeContainerオブジェクト。
戻り値:
グループ図形SerializableElementオブジェクトを返す。
グループ図形の子要素もSerializableElementに変換し、 childrenList(ArrayList)に子要素の SerializableElementを格納して返す(図8.1(b)のツリー構造形式)。
処理:
convertShapeContainer で子要素をSerializableElementオブジェクトに変換し、 childrenListに子要素のSerializableElementオブジェクトを格納する。
子要素がグループ図形の場合、convertShapeContainerから このメソッド(convertGroupContainer)を再帰的に呼び出すので、 図8.1(a)に示すツリー構造にあるすべての ShapeContainerオブジェクトを SerializableElementオブジェクトに変換できる。
invertShapeContainer
(static)
public static ShapeContainer invertShapeContainer(SerializableElement sElement)
引数:
sElement - SerializableElementオブジェクト
戻り値:
ShapeContainerオブジェクト
処理:
∙ sElementが単一図形の場合

invertSingleContainer を呼んでsElementをSerializableElementオブジェクトに変換する。

∙ sElementがグループ図形の場合

invertGroupContainerを呼んで sElementをSerializableElementオブジェクトに変換する。
このメソッドは 図 8.1 の(b) から (a)への変換である。

invertSingleContainer
(static)
public static ShapeContainer invertSingleContainer(SerializableElement sElement)
引数:
sElement - 単一図形のSerializableElementオブジェクト
戻り値:
ShapeContainerオブジェクト
処理:
ShapeContainerオブジェクトを作成し、 sElementの各フィールド値を、 ShapeContainerと そのShapeElementオブジェクトの対応するフィールドに設定する。
invertGroupContainer

(static)
private static ShapeContainer invertGroupContainer(SerializableElement sElement)
引数:
sElement - グループ図形のSerializableElementオブジェクト
戻り値:
ShapeContainerオブジェクト
処理:
∙ ShapeContainerオブジェクトを作成

sElementの各フィールド値を、 ShapeContainerとそのGroupElementオブジェクトの対応するフィールドに設定する。

∙ 子要素の変換

childrenListから子要素の SerializableElementを取得し、 invertShapeContainerShapeContainerオブジェクトに変換する。
invertShapeContainerからは再帰的に このメソッド(invertGroupContainer)が呼ばれるので、 図8.1(b)のツリー構造にあるすべてのSerializableElementオブジェクト をShapeContainerオブジェクト変換できる。

setToShapeContainer
(static)
public static void setToShapeContainer(SerializableElement data, ShapeContainer container)
UndoableDrawEdit.ChangeContainerで使う。このUndoableDrawEditオブジェクトはShapeContainerの変更を記録するオブジェクトである。ShapeContainerオブジェクトを引数で受け取る、その中身だけを置き換えるメソッドである。
次のsetToSingleContainerまたはsetToGroupContainerを呼んで処理する。
setToSingleContainer
(static)
private static void setToSingleContainer(SerializableElement data, ShapeContainer container)
ShapeContainerオブジェクトを作成せずに引数で受け取る以外は、DrawFileIo.invertShapeContainerと同じ処理を実行する。
setToGroupContainer
(static)
private static void setToGroupContainer(SerializableElement sData, ShapeContainer container)
ShapeContainerオブジェクトを作成せずに引数で受け取る以外は、 SerializableElementUtilクラスの invertGroupContainer と同じ処理を実行する。
子要素のリストから子要素のSerializableElementを取り出し setToShapeContainer を呼んで(再帰呼び出し)、子要素のShapeContainerを子要素リストに格納する。


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