1. FileIoクラス
public class FileIo
メソッド
|
説明
|
コンストラクタ
|
public FileIo()
∙ JFileChooserオブジェクト作成。
∙ ファイル拡張子をJFileChooserオブジェクトに設定。
fileChooser.setFileFilter(filter)
|
fileNew
|
public void fileNew()
∙ saveCurrentFile()を呼び、リターンコードに応じたメッセージを表示する。
∙ PageManagerのinit()メソッドで新しい1ページ目を作成する。
|
fileOpen
|
public void fileOpen()
∙ saveCurrentFile()を呼び、リターンコードに応じたメッセージを表示する。
∙ Application.configファイルに書かれているディレクトリを
FileInformation.getDirectory()で取得。
このディレクトリがnullでなければFileChooser.setCurrentDirectory
でディレクトリをFileChooserに設定する。
∙ fileChooser.showOpenDialogでファイルオープンのダイアログを表示。
ユーザがダイアログで指定した読み込みファイルパス名をfilePathにセット。
FileInformation.convertToDirectoryNameメソッドでファイルパス名からディレクトリパス名を取り出し、
FileInformation.setDirectoryでApplication.configファイルに書き込む。
∙ ファイルパス名filePathを使いObjectInputStreamを作成。
ObjectInputStream in=new ObjectInputStream(new FileInputStream(filePath));
∙ DrawFileIo.readPageListメソッドでページリストを読み込む。
pageManager.readPageList(in);
readPageListで画面に表示するページを1ページ目に設定し、
PageManager.showPageで1ページ目を表示する。
|
fileSave
|
public int fileSave()
現在編集中のファイルを保存する。現在のファイルが新規でファイル名が指定されていない場合、
次のfileSaveAs()を呼ぶ。
戻り値:
0: save完了。
1: ファイルチューザーでキャンセルが指定されたので、saveせずにリターン。
処理:
∙ currentFilePath=nullの場合。
fileSaveAs()を呼んでリターン。
∙ 待機カーソル(WAIT_CURSOR))設定。
∙ 現在開いている画面をPageManagerにsave。
∙ 編集中のファイルをthis.currentFilePathのファイル名で保存する。
編集中のファイルをpageManager.saveCurrentPage()で、PageManagerに保存。
ファイルへの書き込みは、DrawFileIo.writePageListで行う。
∙ 書き込んだファイルのディレクトリパス名をApplication.configファイルに書き込む。
FileInformation.setDirectory(directory);
∙ 後処理
デフォールトカーソル設定し、
UndoDrawManagerオブジェクトの変更履歴を空にする。
|
fileSaveAs
|
public void fileSaveAs()
JFileChooser.showSaveDialogでダイアログを表示し、
ユーザにファイルパス名を指定してもらい現在表示中のファイルを保存する。
戻り値:
0: save完了。
1: ファイルチューザーでキャンセルが指定されたので、saveせずにリターン。
処理:
∙ 現在のディレクトリ名をJFileChooserにセット。
最近開いたディレクトリ名はFileInformationクラスに保存されている。
∙ JFileChooserを開く。
∙ JFileChooserのリターンコード(ret)により、(a)または(b)を実行する。
(a)ret=JFileChooser.CANCEL_OPTIONのとき
=>戻り値を1にしてリターン
(b)ret=JFileChooser.APPROVE_OPTIONのとき
=>JFileChooserからファイルパス名を取得し、ファイル名をthis.currentFilePathに設定
∙ マウスカーソルを、待機カーソル(Cursor.WAIT_CURSOR)に変更。
∙ 編集中のファイルをthis.currentFilePathのファイル名で書き込む。
ファイルへの書き込みは、DrawFileIo.writePageListクラスで行う。
∙ 後処理
デフォールトカーソル設定し、UndoDrawManagerの変更履歴を空にする。
|
saveCurrentFile
|
public int saveCurrentFile()
編集中のファイルに変更があるか否かをチェックし、変更があればsaveするか否かの確認ダイアログを表示する。
saveが指定された場合、fileSave()またはfileSaveAs()
によりファイルを保存する。
戻り値:
-1: ファイルに変更ないためsaveせずにリターン
0: saveしてリターン、ファイル名はthis.currentFilePathに設定される。
1: save yes/no/cancelのダイアログでnoが指定されたので、saveせずにリターン。
2: save yes/no/cancelのダイアログでcancelが指定されたので、saveせずにリターン。
処理:
∙ 編集中のファイルに変更があるか否かをチェック。
UndoDrawManager.canUndo()
のリターンコードがtrueならば、ファイルに変更があるので確認ダイアログを表示。
=>変更がなければ、戻り値-1でリターン。
:
表示画面では、Shapeタブで表示されるundoボタンがenableならば、ファイルに変更がある。
∙ 確認ダイアログの表示
ret=JOptionPane.showConfirmDialog(ObjectTable.getDrawMain(), message, "", option);
//ret: JOptionPane.YES_OPTION=0, NO_OPTION=1, CANCEL_OPTION=2
messageは、編集中のファイルが新規(new)でファイル名がない場合と、ある場合で変える。
∙ 戻り値の設定とリターン
ret=NO_OPTION/CANCEL_OPTIONの場合、retを戻り値としてリターン。
ret=YES_OPTIONの場合は次の処理を実行する。
∙ ファイルのsave
<ファイル名なしの場合=>fileSaveAs()を呼ぶ。
ファイル名ありの場合=>fileSave()を呼ぶ。
|
printOut
|
public static void printOut()
印刷コマンド(print)を処理する。
印刷を制御するPrinterJobを取得し、PageableクラスのBookをthis.createBookで
作成してPrinterJobセットし、printerJob.print()で印刷。
=>
printer出力関連クラス
|
createBook
|
public static Book createBook()
PageableクラスのBookをPageManagerが管理するページリストから作成する。
java.awt.print.Bookオブジェクトを作成して、
PageManagerが管理するページリストの各ページのデータから
PrintableDrawPageオブジェクトと
java.awt.print.PageFormatオブジェクトを作成しbookにページを追加する。
book.append(new PrintableDrawPage(i+1), pageFormat)
∙ java.awt.print. PageFormatオブジェクト(pageFormat)を作成し、次の設定を行う。
(a) ページの向き(PageFormat.PORTRAIT/ PageFormat.LANDSCAPE)を設定
(b) ページの用紙の設定 pageFormat.setPaper(paper)
∙ ページの用紙(paper)の設定:java.awt.print.Paperオブジェクトを作成して次の設定を行う。
(a) 用紙のサイズ設定
(b) 印刷領域の設定
参照=>PrintableDrawPage
|
exit
|
public void exit()
exitコマンド(アプリケーション終了)の処理。
System.exit(0);
|
:
Application.configファイル
実行モジュールのあるファイルにApplication.configファイルを作成し、
*.drawファイルのディレクトリ名を書き込む。ファイルディレクトリ名を記憶することによって、
前回アクセスしたファイルのディレクトリをJFileChooserのダイアログに表示することができる。
ConfigFileクラスを使って構成している。
:
FileIOで使うJFileChooserのメソッド
戻る=>page top
メソッド
|
説明
|
setFileFilter
|
setFileFilter(FileFilter filter)
現在のファイルフィルタを設定。
|
setSelectedFile
|
setSelectedFile(File file)
選択されたファイルを設定。
|
showOpenDialog
|
showOpenDialog(Component parent)
∙ [Open File] ファイルチューザダイアログを表示。
∙ 戻り値がJFileChooser.APPROVE_OPTION以外はエラーかcancel。
|
showSaveDialog
|
public int showSaveDialog(Component parent) throws HeadlessException
∙ [Save File] ファイルチューザダイアログを表示。
∙ 戻り値がJFileChooser.APPROVE_OPTION以外はエラーかcancel。
|
setCurrentDirectory
|
public void setCurrentDirectory(File dir)
∙ 現在のディレクトリを設定。
|
getSelectedFile
|
public File getSelectedFile()
∙ 選択されたファイルを返す。
|
2. DrawFileIoクラス
戻る=>page top
public class DrawFileIo
ファイル書き込みのための図形データの変換(特にグループ図形)
(a) ContainerListと
グループ図形のShapeContainerオブジェクト
|
(b) SerializableElementUtilクラスで
変換されるグループ図形のSerializableElementオブジェクト
|
(c) SerializableElementListとグループ図形のSerializableElementオブジェクト
このクラスではGroup(No-6)内の子要素へのリンクを全て切断し、 Group(No-6)をばらばらの
SerializableElementオブジェクトに分解してSerializableElementListに格納する。
|
図2.1 ShapeContainerとSaerializableElementオブジェクトの操作
SerializableElementUtilクラスで(a)から(b)へ、
さらにこのクラス(DrawFileIo)で(b)から(c)へ変換し グループをばらばらにしてファイルに書き込む。
フィールド
|
説明
|
versions |
public final String[] versions={"ver0.0", "ver1.0",
"ver1_0"};
|
メソッド
|
説明
|
writePageList
|
public void writePageList(ObjectOutputStream out) throws Exception
fileSave
、fileSaveAsから呼ばれ、
PageManager.PageList
をファイルに書き込む。
処理:
∙ 最初にバージョン番号をString形式で書き込む。次にPageListのsizeを書き込む。
∙ PageDataオブジェクトからContainerListとViewDataを取り出してファイルに書き込む。
ViewDataはViewData.writeViewData
メソッドで書き込む。
∙ ContainerList
グループ図形の親子リンクを生成するメソッドをまとめた
writeContainerList
メソッドでファイルに書き込む。
=>
Figure 2.2, Figure 2.3
|
writeContainerList
|
public void writeContainerList(ObjectOutputStream out, String version,
ArrayList ContainerList)
引数:
version - バージョン番号
ContainerList- ContainerManagerのContainerList(ArrayList)
処理:
∙ serializableElementList(ArrayList)オブジェクトを作成する。
∙ 次のconvertContainerLIstで
ContainerListを変換し、 serializableElementListに書き込む。
ContainerManagerの
ContainerList
に登録されているShapeContainerを
SerializableElementに変換し、
serializableElementListに書き込む。
∙ このクラスのwriteSerializableElementメソッドで、serializableElementListに登録されているSerializableElementをファイルに書き込む。
|
convertContainerList
|
public void convertContainerList(ArrayList containerList,
ArrayList serializableElementList) throws Exception
ContainerList
(ArrayList)に格納されている図形データ(ShapeContainer)を
SerializableElement 変換して
serializableElementList(ArrayList)に格納する。
引数:
containerList - ContainerManagerの
ContainerList(ArrayList)
serializableElementList - SerializableElement
を格納したArrayList
処理:
∙ ContainerManagerのContainerListに格納されている ShapeContainerを、このクラスのconvertShapeContainerメソッドで
SerializableElementに変換し、
SerializableElementList(ArrayList)に書き込む。
:
グループ図形の扱い
ContainerListに格納されている
ShapeContainerがグループ図形の場合、
ShapeContainerの
getGroupedContainers()
で、ShapeContainer自身と全ての子要素(グループの要素を含む)を返すことができる。
例えば、図2.1 (a)の例では、ShapeContainerがGroup0の場合には、
Group0, Group1, Single Shape0, Single Shape1, Single Shape2が返される。
したがって繰り返し処理を行うだけでよい。
|
convertShapeContainer
|
public SerializableElement[] convertShapeContainer(ShapeContainer container)
ShapeContainerオブジェクトを SerializableElementオブジェクトに変換する(図2.1 (a)->(c))。
ShapeContainerがグループ図形ならばその子要素のShapeContainerもすべて変換する。
引数:
container - ShapeContainerオブジェクト。
戻り値:
SerializableElement
オブジェクト。
処理:
∙ 引数container が単一図形の場合
SerializableElementUtilの
convertSingleContainerメソッドを呼んで、
containerをSerializableElementオブジェクトに変換する。
∙ 引数container がグループ図形の場合
このクラスのconvertGroupContainerメソッドを再帰的に呼んで、
containerをSerializableElementオブジェクト
に変換する(図2.1 (a)->(c))。
|
convertGroupContainer
|
public SerializableElement[] convertGroupContainer(ShapeContainer container)
グループ図形を表すShapeContainerオブジェクトを、
その子要素も含めてSerializableElementオブジェクトに変換
((図2.1 (a)->(c)))して返す。
引数:
container - ShapeContainer(グループ)オブジェクト。
戻り値:
SerializableElementオブジェクトの配列。
処理:
ShapeContainerのgetGroupedContainersメソッドを
呼んで、ShapeContainer自身とグループの子要素すべてを返す。
これらに対してSerializableElementUtilの
convertSingleContainerメソッドを呼んで、
SerializableElementオブジェクトに変換する(図2.1 (a)->(b))。
そして変換された要素がグループSerializableElementオブジェクトならば、
childrenList内の
子要素のSerializableElementオブジェクトを、
そのshapeIdで置き換え子要素へのリンクを切断する(図2.1 (b)->(c))。
|
writeSerializableElement
|
private static void writeSerializableElement(ObjectOutputStream out, SerializableElement sShape) throws Exception
処理:
∙ 最初にversionの文字列を書き込む。
∙ SerializableElementのフィールド変数を書き込む。
∙ SerializableCurve2Dオブジェクトと
SerializableAttributedStringオブジェクト
=>それぞれのクラスの書き込みメソッドを使ってオブジェクトを書き込む。
|
readPageList
|
public void readPageList(ObjectInputStream in) throws Exception
fileOpen()から呼ばれ、ファイルからデータを読み、
PageManager.PageListを作成する。
処理:
∙ ViewDataはViewData.readViewDataメソッドで読み込む。
∙ ContainerListは、
readContainerListメソッドで読み込む。
=>Figure 2.2, Figure 2.3
|
readContainerList
|
public ArrayList readContainerList(int page, ObjectInputStream in)
このクラスのメソッド以外では、部品ライブラリ関係のComponentManager
から呼ばれる。
引数:
page - ページ番号(PageManager.CurrentPageに合わせ1から開始)
処理には関係しない。Printで使う。
in - ObjectInputStreamオブジェクト
処理:
∙ containerListオブジェクトを作成。このArrayList に結果を格納して戻り値で返す。
ArrayList containerList=new ArrayList();
∙ ファイルからreadSerializableElementメソッドで
SerializableElementオブジェクトを読み込み、
SerializableElementListに加える。
∙ SerializableElementListをこのクラスの
invertContainerList
メソッドで変換してcontainerListに格納するので、
それを戻り値に設定して返す。
|
readSerializableElement
|
public static SerializableElement readSerializableElement(ObjectInputStream in) throws Exception
処理:
∙ SerializableElementオブジェクトを作成して、そのフィールドにファイルから読んだデータを設定する。
∙ SerializableCurve2Dオブジェクトと
SerializableAttributedStringオブジェクト
=>それぞれのクラスの読み込みメソッドを使ってフィールドを読み込む。
|
invertContainerList
|
private void invertContainerList(ArrayList containerList, ArrayList serializableElementList)
引数:
containerList - ContainerManagerが管理する1ページ分の図形データを格納したリスト
(ContainerList)
serializableElementList -
SerializableElementを格納したArrayList
処理:
SerializableElementList内の全てのSerializableElementの変換は、
次のinvertShapeContainer
メソッドを呼んで ShapeContainerへ変換する。
|
invertShapeContainer
|
public ShapeContainer invertShapeContainer(SerializableElement sElement,
ArrayList SerializableElementList)
SerializableElementとSerializableElementList(ArrayList)からShapeContainerを再生する。
引数:
sElement - SerializableElementオブジェクト
serializableElementList - SerializableElementを格納したArrayList
戻り値:
ShapeContainer - ShapeContainerオブジェクト
処理:
∙ sElementが単一図形の場合、SerializableElementUtil のinvertSingleContainerを呼ぶ。
∙ sElementがグループ図形の場合、SerializableElementUtil のinvertGroupContainerメソッドを呼ぶ。
SerializableElementUtil
のinvertGroupContainerメソッドではchildrenListに子要素のshapeIdを格納して返す。
このクラスのgetSerializableElementメソッドで子要素の
SerializableElementを取り出し、
このメソッドを再帰的に呼び出し、子要素のShapeContainerオブジェクト
を作成し、 groupElement.addChildrenメソッドで
ShapeContainerオブジェクトの
グループ要素(GroupElement)に登録する。
=>
Figure 2.1 (b)->(a)
|
getSerializableElement |
private SerializableElement getSerializableElement(String shapeId, ArrayList
sElementList)
引数:
shapeId - shapeId.
sElementList - SerializableElementを格納したArrayList.
戻り値:
パラメータで指定されたshpeIdを持つSerializableElementオブジェクトをsElementListから探して返す。
|
isDuplicatedNumber |
public boolean isDuplicatedNumber(ArrayList serializableElementList)
処理:
|
printContainerList
|
private void printContainerList(String title, ArrayList ContainerList)
引数:
containerList - ContainerManagerが管理する1ページ分の図形データを格納したリスト
(ContainerList)
処理:
ContainerListに登録されている図形データを順にプリントアウトする。デバッグ用。
|
printSerializable
ElementList
|
private void printSerializableElementList(String title, ArrayList sElementList)
処理:
sElementListの要素を順にプリントアウトする。デバッグ用。
|
|
図 2.2 書き込みメソッドの階層
|
|
図 2.3 読み込みメソッドの階層
|
3. ExtensionFileFilterクラス
戻る=>page top
public class ExtensionFileFilter extends FileFilter
フィールド
|
説明
|
description
|
private String description
フィルターの説明を設定。
|
extensions
|
private ArrayList arrayList
拡張子を登録するリスト。
|
メソッド
|
説明
|
addExtension
|
public void addExtension(String extension)
拡張子をArrayListに追加する
|
setDescription
|
public void setDescription(String description)
フィルターの説明を設定。
|
getDescription
|
public String getDescription()
フィルターの説明を返す。
|
accept
|
public boolean accept(File file)
fileがArrayListに登録されている拡張子に一致すればtrueを返す。
|
4. FileInformationクラス
戻る=>page top
public class FileInformation
∙ 現在のプロジェクトの直下にApplication.configファイルを作成し、*.drawファイルのディレクトリ名を書き込む。ファイルディレクトリ名を記憶することによって、前回アクセスしたファイルのディレクトリをJFileChooserのダイアログに表示することができる。
∙ Application.configファイルへのアクセスは次のConfigFileクラスを使って行う。
メソッド
|
説明
|
getDirectory
|
public String getDirectory()
∙ Application.configファイルが無ければ作成
file.createNewFile();
∙ configファイルをロード
∙ "FileChooser.Directory"のキーで値をfileChooserDirectoryにget。
fileChooserDirectory=configFile.getValue("FileChooser.Directory");
fileChooserDirectory=""のケースもあるので注意。
|
setDirectory
|
public void setDirectory(String fileChooserDirectory)
∙ Application.configをロード
∙ "FileChooser.Directory"のキーで引数fileChooserDirectoryをconfigに書き込む
configFile.putValue("FileChooser.Directory", fileChooserDirectory);
∙ configファイルをsave。
configFile.save();
|
convertToDirectoryName
|
public String convertToDirectoryName (String filePath)
ファイルパス名filePathからディレクトリパス名を作る。
例えばfilePathが”C:\DrawProto\DrawFile\file1.draw”のとき、ディレクトリパス名は”C:\DrawProto\DrawFile\”。
|
getSimpleFileName
|
public static String getSimpleFileName(String filePath)
∙ファイルパス名filePathからファイル名だけを取り出す。
例えばfilePathが”C:\DrawProto\DrawFile\file1.draw”のとき、出力されるファイル名は” file1.draw”。
|
5. ConfigFileクラス
戻る=>page top
public class ConfigFile
java.util.Propertiesクラスを使いキー付きデータのファイル入出力、キー検索などを行う。
現在、JFileChooserに設定するディレクトリを記録するためのApplication.configファイルに使っている。
フィールド
|
説明
|
properties
|
private Properties properties
コンストラクタで作成したPropertiesオブジェクトを保持する。
|
fileName
|
private String fileName
コンストラクタの引数で渡されるファイル名称を保持する。
|
メソッド
|
説明
|
コンストラクタ
|
public ConfigFile()
Propertiesオブジェクトの新規作成。
|
setFileName |
public void setFileName(String fileName)
ファイル名称をフィールド変数に設定する。 |
load
|
public void load() throws IOException
∙ フィールド変数fileNameを引数として FileInputStreamを作成。
∙ Properties.loadメソッドでファイルをロードする。
|
save
|
public void save() throws IOException
∙ フィールド変数fileNameを引数として FileOutputStreamを作成。
∙ Properties.storeメソッドでファイルをセーブする。
|
getValue
|
public String getValue(String sKey)
∙ Properties. getProperty(sKey)メソッドでキーを取得。
|
putValue
|
public void putValue(String sKey, String sValue)
∙ properties.put(sKey, sValue)メソッドでキーとキーに対応する値を書き込む。
|
getKeys
|
public Enumeration getKeys()
∙ properties.propertyNames()メソッドでキーのEnumerationリストを返す。
|
6. PrintableDrawPageクラス
戻る=>page top
public class PrintableDrawPage implements Printable
フィールド
|
説明
|
containerManager
|
ContainerManager containerManager
コンストラクタの引数で渡されるPageManagerのページを管理するContainerManagerオブジェクト。
|
メソッド
|
説明
|
コンストラクタ
|
public PrintableDrawPage(int page)
引数:
page: - 印刷するPageManagerのページを指定。
処理:
ContainerManagerオブジェクトを作成し、PageManagerのページリストをセットする。
ArrayList list=pageManager.getContainerList(page);
this.containerManager.setContainerList(list);
|
print
|
public int print(Graphics g, PageFormat pf, int pageIndex)
Printableインターフェイスで指定されているメソッド。印刷データを作成する。
ContainerManagerオブジェクトに格納されている図形データ(ShapeContainer)を取り出し、ShapeContainer.drawShape(g)で描画する。
[注意]
∙ DrawParameters.DrawMode=DrawParameters.DrawPrinter
この設定により、図形の選択ボックス、リサイズハンドル、
テキスト領域(LIGHT_GRAYの枠)を表示しなくなる。
∙ 描画スケール設定
Windows画面の解像度は96ピクセル/インチ、印刷のの解像度は72ピクセル(72/96=0.75)ゆえ、
次のように設定する。
double scale=0.75d;
g2.scale(scale, scale);
|
:
printer出力関連クラス
クラス
|
説明
|
java.awt.print.
PrinterJob
|
PrinterJob.getPrinterJob()でデフォールトプリンタのPrinterJobオブジェクトを返す。
printerJob.lookupPrintServicesの戻り値がnullならばエラーメッセージダイアログを表示する。
上記取得したPrinterJobオブジェクトで使うメソッドは次の2つ。
∙ printerJob.setPageable(book); Bookの設定
∙ printerJob.print(); 印刷実行
|
java.awt.print.
Book
|
FileIo.createBookメソッドで作成
book.append(new PrintableDrawPage(i+1), pageFormat);
でPrintableDrawPageとPageFormatをbookに追加。
|
PrintableDrawPage
|
java.awt.print.Printableインタフェースをインプリメントしたクラス
print(Graphics graphics, PageFormat pageFormat, int pageIndex)メソッドでpageIndexのページを印刷する。
|
java.awt.print.PageFormat
|
ページの向きと、Paperオブジェクトを設定。Paperオブジェクトには用紙サイズ、描画領域などを設定する。
∙ pageFormat.setOrientation (PageFormat.PORTRAIT)
∙ pageFormat.setPaper(paper)
|
|