Java Drawing DrawTop

Language

JP  US  UK

 

ページ管理

 H. Jyounishi, Tokyo Japan
 

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

要旨:DrawProtoで図形データを複数ページ作成した場合、複数ページをArrayListで管理する。具体的には、新しいページの挿入、表示ページの切り替えなどである。またこれら複数ページのデータに、画面表示のデータ(拡大率、注視点など)を付け加えて、ファイルへの書き込み、ファイルからの読み込みを行う。
このページで説明するクラス: PageManager, PageData, ViewData, ViewUtil

1. PageManagerクラス
public class PageManager
PageManagerが管理する複数ページとページの順番は、次のように ダイアログ (DialogOfPageLayout) で表示できる。


Figure 1. Page layout dialog

フィールド
説明
PageList
private ArrayList PageList
1ページのPageDataオブジェクトをページ数分だけ格納するリスト。
=> Figure 2
CurrentPage
private int CurrentPage
現在画面に表示中のページ。ページ番号は1から開始。PageListのindex指定は(CurrentPage-1)にする。CurrentPage=0のケースは、ファイルを新規作成する場合で、initメソッドが呼ばれる。
versions
String[] versions
バージョンの文字列を入れた配列。最初のバージョンは"ver0.0"。
その時のバージョンに応じてversions[i]をファイルの最初に書き込む。

メソッド
説明
init
public void init()
ページを管理するArrayListのPageListをクリアし、CurrentPage=0とする。
setPageList
public void setPageList(ArrayList pageList)
このPageManagerに引数で指定したpageListをセットする。 FileIo.fileOpenメソッドから呼ばれる。
getPageList
public ArrayList getPageList()
このPageManagerからPageListを取り出す。 FileIo.fileSave、 FileIo.fileSaveAsメソッドから呼ばれる。
getCurrentPage
public int getCurrentPage()
フィールド変数CurrentPageを返す。
getUndoDrawManager
public UndoDrawManager getUndoDrawManager()
PageDataに設定しているUndoDrawManagerオブジェクトを返す。
getUndoDrawManager
public UndoDrawManager getUndoDrawManager()
PageDataに設定しているUndoDrawManagerオブジェクトを返す。
initApp
private void initApp()
・表示中の図形を全て、非選択状態にする。
・表示中の一時的な補助図形(TempShape)を削除する。
showTopPage
public void showTopPage()
現在のページをsaveCurrentPageメソッドでPageListに退避し、最初のページ目を表示する。ExecCommand.exec()から呼ばれる。
showLastPage
public void showLastPage()
現在のページをsaveCurrentPageメソッドでPageListに退避し、最後のページ目を表示する。ExecCommand.exec()から呼ばれる。
showNextPage
public void showNextPage()
saveCurrentPageで現在のページをPageListに格納し、showPageメソッドで次ページを表示する。ExecCommand.exec()から呼ばれる。
showPreviousPage
public void showPreviousPage()
saveCurrentPageで現在のページをPageListに格納し、showPageメソッドで前ページを表示する。ExecCommand.exec()から呼ばれる。
insertNewPage
public void insertNewPage()
新しいページを挿入する。ExecCommand.exec()から呼ばれる。
∙ 最初に現在のページをPageListに退避。
∙ 現在のページの前、後ろのどちらにページを挿入するか、JOptionPane.showInputDialogメソッドでダイアログ表示。

前に挿入するときはboolean beforeにtrueを設定。

∙ 新しい図形データが空のContainerListを持つPageDataオブジェクトを作成。

before=true/falseに応じてPageDataオブジェクトを現在のページの前/後に追加する。

∙ showPageメソッドで新しく追加したページを表示する。

deletePage
public void deletePage()
現在表示しているページを削除する。ExecCommand.exec()から呼ばれる。
∙ 確認ダイアログ表示。ユーザの応答がYesでなければリターン。
∙ ユーザの応答がYesならば現在のページをPageListから削除。
∙ 削除したページが最終ページでなければ次ページを表示。削除したページが最終ページの場合は前ページを表示する。

全ページが削除された場合は警告メッセージ出力。

movePage
public void movePage(int selectedPage, int moveTo)
全ページを別のウィンドウに表示してページの並べ替えを行う。
DialogOfPageLayout ダイアログから呼ばれる。
このメソッドで指定ページ(selectedPage)をmoveToページに移動する。moveToは1以上、(ページ数+1)の範囲。後者は最終ページの後に移動する場合である。
なおページを移動しても、主画面には同じページ(移動されたページ)が表示されていなければならない。
pageSetup
public void pageSetup(int sheetSize, int orientation)
DialogOfPageSetupAction.actionPerformedから呼ばれる。
現在のページに用紙のサイズ、向き、表示倍率を設定する。これらの値はDrawParametersで管理されているので対応する値を変更する。
showPage
private int showPage(int selectedPage)
FileIO.fileOpen()とこのクラスの各メソッドから呼ばれる。
引数:
selectedPage - 表示されるページ番号。
1≤selectedPage ≤total(ページ数)
戻り値:
0: 正常終了
-1: 選択ページがない。
処理:
selectedPageで指定されるページを表示する。ページ番号は1から始まるようにしているのでselectedPage>=1が必要。
∙ 指定ページが存在すればPageListからPageDataを取り出す。

ページ番号を保持しているDrawParameters.PageにselectedPageをセット。 指定ページが存在しなければエラーメッセージを出力し戻り値-1でリターン。

∙ PageDataから指定ページのContainerListとViewDataを取り出す。

containerManager.setContainerListとViewDataUtil.setViewDataメソッドでセットする。 最後にdrawPanel.repaint()で画面を再描画。

saveCurrentPage
private void saveCurrentPage()
FileIO.save()FileIO.saveAs()、 DialogOfPageLayoutとこのクラスの各メソッドから呼ばれる。
現在表示中のページ(>=1)の
PageDataオブジェクトを作成し、PageListに登録する。
PageListへの登録はArrayListのsetメソッドで行い、現在のPageDataで古いPageDataを置き換える。
getContainersList
public ArrayList getContainerList(int page)
DialogOfPageLayoutPrintableDrawPage 他とこのクラスのメソッドから呼ばれる。
指定ページのContainerListをPageListから返す。
getViewData
public ViewData getViewData(int page)
DialogOfPageLayoutFileIo.createBook()他とこのクラスのメソッドから呼ばれる。 指定ページのViewDataをPageListから返す。


2. PageDataクラス 戻る=>page top
public class PageData implements Serializable
フィールド
説明
ContainerList
ArrayList ContainerList
1ページ分の表示用図形データを格納したリスト。ContainerManagerで扱える形式。
viewData
ViewData viewData
ページで使う用紙サイズ、向き、表示倍率などのデータ
undoDrawManager
UndoDrawManager undoDrawManager
このページのUndoDrawManagerオブジェクト。コンストラクタが呼ばれたときに新規作成する。

メソッド
説明
コンストラクタ
public PageData(ArrayList containerList, ViewData viewData, UndoDrawManager undoManager)
∙ 引数をフィールド変数に設定。
∙ このページのUndoDrawManagerオブジェクトundoManagerIdを付けて作成しフィールド変数に設定。
setContainerList
public void setContainerList(ArrayList containerList)
ContainerListをセットする。
setViewData
public void setViewData(ViewData viewData)
ViewDataをセットする。
getUndoDrawManager
public UndoDrawManager getUndoDrawManager()
このページに設定されているUndoDrawManagerを返す。
toString
public String toString():文字列表現を返す。


3. ViewDataクラス    戻る=>page top
public class ViewData implements Serializable
ページの表示データ(倍率、用紙サイズ、向き、ViewPositionなど)をまとめたクラス。
PageDataオブジェクトにContainerList、UndoDrawManagerとともに設定される。

フィールド
説明
scale
public double scale
表示倍率
sheetSize
public int sheetSize
用紙サイズ(mm単位)
drawPanelWidth
public int drawPanelWidth
DrawPanelの幅
drawPanelHeight
public int drawPanelHeight
DrawPanelの高さ
sheetOrientation
public int sheetOrientation
用紙の向き
viewPosition
public Point leftTopPointOfView
ViewPosition

メソッド
説明
toString
public String toString()
このオブジェクトの文字列表現を返す。
writeViewData
(static)
public static int writeViewData(ObjectOutputStream out, ViewData viewData, String version)
ViewDataをファイルに書き込む。
readViewData
(static)
public static ViewData readViewData(ObjectInputStream in)
ファイルから読み込みViewDataに設定して返す。


4. ViewUtilクラス 戻る=>page top
public class ViewUtil 
メソッド
説明
zoom
public void zoom(double scale)
∙ 表示図形を拡大/縮小する。Viewportの中心に表示されている図形は、拡大/縮小後に、 やはりViewportの中心に表示するように処理する。
∙ 拡大/縮小では、DrawPanelのサイズを JComponent.setPreferredSize(Dimension preferredSize)で設定する。
∙ DrawPanelに描かれている図形の拡大/縮小は、 DrawPanel.paintToBuffer(Graphics g)で g2.setScale(scale,scale)により、スケールを設定し、 ShapeContainer.drawShape(Graphics g)で描画する。
引数:
scale - 新しい表示倍率 
処理:
∙ 拡大/縮小したときのViewportの中心点のDrawPanel上の位置を計算。

その点からViewPanelのViewPositionを計算し、ViewPortに設定する。

=>図 3
setViewメソッドを呼ぶ。
getViewPanel
public JPanel getViewPanel(JPanel drawPanel)
DrawPanelを貼り付けるViewPanelを作成する。
=>図 2
setView
public void setView(double scale, Point viewPosition)
引数:
scale - 倍率
viewLeftTop - ビュー位置。Javaでの記述はJViewport、ViewPositionである。
処理:
∙ 拡大/縮小後のDrawPanelのサイズ設定

DrawParametersのgetSheetSizeByPixelメソッドで、シートサイズを取得。 DrawPanelのサイズを(scale*シートサイズ)とし、 setPreferredSizeメソッドで設定する。
drawPanel.setPreferredSize(newSize);

getViewPanelメソッドでViewPanel(図2) を取得し、スクロールペインのビューポートに貼り付ける。

JViewport viewport=scrollPane.getViewport();
viewport.setView(viewPanel);

∙ viewportにViewPanelのViewPositionを設定する。

viewport.setViewPosition(new Point((int)viewLeftTopX,(int)viewLeftTopY));

DrawPanelのrevalidate, repaintメソッドをコール。
moveView
(static)
public static void moveView(Point mousePosition)
引数:
mousePosition - マウスの現在位置
処理:
マウスの現在位置がビューポートの外側ならば、ビュー(実質的にはDrawPanel) をマウスの方向に一定距離移動する。移動距離は定数で決められており現在のところ5ピクセル。 ビューの移動は引数viewPositionに新しい値を設定して setViewメソッドを呼ぶことにより行なう。
getViewData
(static)
public static ViewData getViewData()
現在の表示データ(倍率、用紙サイズ、向き、ViewPosition)を設定したViewDataオブジェクトを返す。
setViewData
(static)
public static void setViewData(ViewData data)
ViewDataオブジェクトを表示データに設定する。
getViewPosition
(static)
public static Point getViewPosition()
JScrollPaneのviewport左上隅点のView上での位置(ViewPosition )を返す。


(a) フレーム

(b) ウィンドウを横に広げる(c) ウィンドウを小さくする

図 2 ウィンドウの構成



100%表示

141%にズームアップ(イン)

図3 ズーム



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