Java Drawing DrawTop

Language

JP  US  UK

 

ファイル入出力

 H. Jyounishi, Tokyo Japan
 

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

要旨:file new、open、save, saveAs, printなどのコマンドを実行するメソッドを提供する。
このページで説明するクラス: FileIo, DrawFileIo, ExtensionFileFilter, FileInformation, ConfigFile, PrintableDrawPage


1. FileIoクラス
public class FileIo

フィールド 説明
fileChooser JFileChooser fileChooser
このFileIOで使うJFileChooserを設定。
currentFilePath private String currentFilePath
file openした時のファイルパス名を設定。file saveのときこのパス名でsaveする。
fileInformation FileInformation fileInformation=new FileInformation();
The FileInformation object.

メソッド 説明
コンストラクタ 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
fileSavefileSaveAsから呼ばれ、 PageManager.PageList をファイルに書き込む。
処理:
∙ 最初にバージョン番号をString形式で書き込む。次にPageListのsizeを書き込む。
PageDataオブジェクトからContainerListViewDataを取り出してファイルに書き込む。

ViewDataViewData.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)オブジェクトを作成する。
∙ 次のconvertContainerLIstContainerListを変換し、 serializableElementListに書き込む。

ContainerManagerContainerList に登録されているShapeContainerSerializableElementに変換し、 serializableElementListに書き込む。

∙ このクラスのwriteSerializableElementメソッドで、serializableElementListに登録されているSerializableElementをファイルに書き込む。
convertContainerList
public void convertContainerList(ArrayList containerList, ArrayList serializableElementList) throws Exception
ContainerList (ArrayList)に格納されている図形データ(ShapeContainer)を SerializableElement 変換して serializableElementList(ArrayList)に格納する。
引数:
containerList - ContainerManagerContainerList(ArrayList)
serializableElementList - SerializableElement を格納したArrayList
処理:
ContainerManagerContainerListに格納されている ShapeContainerを、このクラスのconvertShapeContainerメソッドで SerializableElementに変換し、 SerializableElementList(ArrayList)に書き込む。
: グループ図形の扱い

ContainerListに格納されている ShapeContainerがグループ図形の場合、 ShapeContainergetGroupedContainers() で、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 が単一図形の場合

SerializableElementUtilconvertSingleContainerメソッドを呼んで、 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オブジェクトの配列。
処理:
ShapeContainergetGroupedContainersメソッドを 呼んで、ShapeContainer自身とグループの子要素すべてを返す。 これらに対してSerializableElementUtilconvertSingleContainerメソッドを呼んで、 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を作成する。
処理:
ViewDataViewData.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メソッドを呼ぶ。

SerializableElementUtilinvertGroupContainerメソッドでは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クラスを使って行う。

フィールド
説明
configFile
configFile configFile=new ConfigFile();
The ConfigFile object.

メソッド
説明
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)


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