Java Drawing DrawTop

Language

JP  US  UK

 

ページレイアウトダイアログ

 H. Jyounishi, Tokyo Japan
 

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

要旨:ページの順番を変更するダイアログを表示する。

このページで説明するクラス: DialogOfPageLayout, PagePanel

1. 概要 戻る=>page top
page layoutボタンを押すと図1のページレイアウトダイアログが表示される。 全ページを図1のように縮小し並べて表示する。もしあるページの用紙が縦向きならば90°回転して横向きに表示する。
このダイアログでページ選び、マウスで移動すればページを指定の位置に配置できる。 つまりページの並べ替えをすることができる(図4の操作)。


図 1. ページレイアウトダイアログ(初期表示)


図 2. ページレイアウトダイアログ(リサイズ後)



2. DialogOfPageLayoutクラス 戻る=>page top
public class DialogOfPageLayout extends JDialog

このクラスは、ダイアログの中にスクロールペインを配置し、 スクロールペインのビュー(View)としてPagePanelをセットしてダイアログを画面に表示する。

スクロールペインの中に各ページを並べて描画するのは後述のPagePanelの仕事である。 またPagePanelは選択されたページに枠をつける、選択されたページの移動先に縦線を表示する処理を行う。


フィールド

説明

scrollPane

JScrollPane scrollPane

ダイアログに設定するスクロールペインオブジェクト (図 1)

scrollPaneSize

Dimension scrollPaneSize

スクロールペインの初期サイズ。

pagePanel PagePanel pagePanel
PagePanel オブジェクト。
listener

PageLayoutListener listener

PageLayoutListener オブジェクト。


メソッド

説明

コンストラクタ

public DialogOfPageLayout()

次の設定を行う。

super(ObjectTable.getDrawMain(), "page layout");
this.setName("DialogOfPageLayout");
this.listener=new PageLayoutListener(this);
this.addComponentListener(this.listener);
this.addWindowListener(this.listener);
ObjectTable.getPageManager().saveCurrentPage();

showDialog

public void showDialog()

ダイアログを次の手順で表示する。

∙ このダイアログがすでに開いているならば何もせずにリターン。

ダイアログが開いているか否かは、menuUtilgetMenuComponentメソッドでチェックできる。

・ダイアログの位置を設定。親コンポーネントであるフレームでの位置を指定する。これは見た目で決める。

・ダイアログの中に全ページを表示するパネルをcreateLayoutPanelメソッドで作成。

∙ このオブジェクトをmenuUtilsetMenuComponentメソッドで MenuComponentList に登録。

setScrollViewPosition

protected void setScrollViewPosition()

scrollPaneにビュー位置を設定する。

: このメソッドはPageLayoutListenercomponentShown メソッドから呼ばれる。

createLayoutPanel

private static JPanel createPagePanel()

ダイアログに貼り付けるパネルを作成する (図 1)。

・JPanelをインスタンス化してbaseパネルを作成する。

このパネルにスクロールペインを貼り付け戻り値として返す。

PagePanel をインスタンス化。

スクロールペインのviewportにPagePanel をセットする。

getScrollPane protected JScrollPane getScrollPane()
scrollPaneを返す。
getPagePanel protected JPanel getPagePanel()
pagePanelを返す。


3. PagePanelクラス 戻る=>page top
class DrawPagePanel extends JPanel implements MouseListener, MouseMotionListener

このクラスは、スクロールペインの中に全ページを並べて描画する、選択されたページに枠をつける、ページの移動先に縦線を表示するなどの処理を行う。


フィールド

説明

dialog

DialogOfPageLayout dialog

DialogOfPageLayoutオブジェクト

xNumOfFrames

int xNumOfFrames

x方向へのページ表示数(図1では5)

yNumOfFrames

int yNumOfFrames

y方向へのページ表示数。

pageFrameRects

private Rectangle2D[] pageFrameRects

各ページの配置位置(左上隅点)とサイズを表すRectangle2Dの配列をセットする。

selectedPage

int selectedPage
マウスボタンを押して選択したページ番号(index)をmousePressedメソッドで設定する。
選択されたページは図4に示すように太い黒枠で表示される。

gapIndex

int gapIndex

pageFrameRectsの矩形の間のギャップのインデックス。選択したページの移動先。

: ギャップインデックスの番号付け=>図3, 移動先=> 図 4

gap final Dimension gap=new Dimension(20, 20);
x,y方向キャップのサイズ。

メソッド

説明

Constructor

public PagePanel()

setPageLayoutを呼んで、DrawPagePanelに表示する全ページのレイアウトを決める。

paint

public void paint(Graphics g)

paintメソッドでは、ページが選択されたときにそのページを囲む太枠を表示する、選択ページを移動したときに移動先に太い縦線を表示する処理を行う。

なお配置される各ページの中を描画するのはdrawPageメソッドの仕事である。

setPageLayout

private void setPageLayout()

xNumOfFramesyNumOfFramesを計算する。

これらの値はscroll paneのサイズ、getPageFrameSizeの戻り値, gapの示すギャップの大きさ、そして総ページ数から計算できる。

getPagePanelSize の戻り値をこのパネルのサイズ(preferred size)として設定。

getPageFrameRectsメソッドを呼んで戻り値をpageFrameRectsに設定。

∙ このオブジェクトのrevalidateメソッドを呼ぶ。

getPageFrameSize

private Dimension getPageFrameSize()

このメソッドはsetPageLayoutから呼ばれる。

戻り値:

ページデータを表示する小さなフレームのサイズ。現在はA4横の1/8のサイズを返す。

getPagePanelSize

private Dimension getPagePanelSize()

このメソッドはsetPageLayoutから呼ばれる。

戻り値:

このPagePanelオブジェクトのサイズを返す。

getPageFrameRects

private Rectangle2D[] getPageFrameRects()

このメソッドはsetPageLayoutから呼ばれる。

戻り値:

各ページを表示する矩形(フレーム)の配列を返す。xNumOfFramesyNumOfFramesが与えられgetPageFrameSizeで矩形(フレーム)のサイズが戻るので、簡単に計算できる。

drawPage

private void drawPage(Graphics g, int pageIndex, Rectangle2D rect)

引数:

pageIndex - 表示するページにインデックス (pageIndex>=1)

rect - 表示領域を表す矩形。

処理:

∙ pageIndexに該当する ContainerList を新規作成の ContainerManagerに設定、pageIndexに該当するViewData も次のように取得する。

PageManager pageManager=ObjectTable.getPageManager();
ArrayList list=pageManager.getContainerList(pageIndex);
ViewData viewData=pageManager.getViewData(pageIndex);
ContainerManager containerManager=new ContainerManager();
containerManager.setContainerList(list);

getScaleメソッドを呼んで、rectに収まるように描くための倍率を計算する。

∙ もし用紙の向きが縦ならば、Graphics2D(g2)に90度回転を設定する。

ContainerList の図形オブジェクトをShapeContainerdrawShapeメソッドで描画する。

∙ "page-n"の文字列をrectの下に描画。

getScale

private double getScale(ViewData viewData, Rectangle2D rect)

引数:
vieData - ViewData オブジェクト.
rect - ContainerListの図形オブジェクトを描画する領域。

Returns:

rect内に描画するための倍率を返す。

mousePressed

public void mousePressed(MouseEvent e)

ptInsideメソッドでマウスの現在位置を含むページ番号を求める。含むページがあればそのページを選択ページとし、ページ番号(>=1)をselectedPageにセットする。なければselectedPage=0。

mouseDragged

public void mouseDragged(MouseEvent e)

getNearestGapメソッドで現在のマウス位置に最も近いギャップ番号を求め、gapIndexにセット。gapIndexを見てギャップ位置にpaintメソッドで縦線を表示する(図4)。

mouseReleased

public void mouseReleased(MouseEvent e)

マウスを離すときに、選択ページの移動先が決定する。PageManager.movePageメソッドで選択ページ(selectedPage)をgapIndexの位置に移動する。

mouseClicked

public void mouseClicked(MouseEvent e)
何もしない。

mouseEntered

public void mouseEntered(MouseEvent e)
Nothing is done.

mouseExited

public void mouseExited(MouseEvent e)
Nothing is done.

mouseMoved

public void mouseMoved(MouseEvent e)
Nothing is done.

ptInside

public int ptInside(Point2D point)

pointが表示中のページ領域のどれかに含まれるかをチェックする。含まれる場合にページインデックス番を返す。どのpageRectanglesにも含まれないときは-1を返す。

getNearestGap

public int getNearestGap(Point2D point)

pointに最も近いギャップを求めギャップ番号を返す。ギャップ番号(index)は、1ページの前がindex=0、1ページの後ろ2ページの手前がindex=1、……である(図3)。


Figure 3 The page index and gap index

Figure 4 The selected page (black frame)
and the desitination (bold vertical line between page-1 and page-2)



4. Class PageLayoutListener 戻る=>page top

class PageLayoutListener extends WindowAdapter implements ComponentListener


Field

Description

dialog DialogOfPageLayout dialog

The DialogOfPageLayout object.


Method

Description

Constructor

public PageLayoutListener()

setPageLayoutを呼んで、DrawPagePanelに表示する全ページのレイアウトを決める。

componentResized

public void componentResized(ComponentEvent e)

ダイアログのサイズが変更になった時に呼ばれる。

DialogOfPageLayoutのサイズに応じてscrollPaneをリサイズする。

scrollPane にsetPreferredSizeメソッドでサイズを設定し、それらのrevalidateメソッドを呼ぶ。さらに最後に DialogOfPageLayout メソッドを呼ぶ。次のようにる。

scrollPane.setPreferredSize(newSize);
this.dialog.getScrollPane().revalidate();
this.dialog.validate();
this.repaint();

componentShown public void componentShown(ComponentEvent e)
DialogOfPageLayoutsetScrollViewPositionメソッドを呼ぶ。
windowClosing public void windowClosing(WindowEvent e)
closeDialogメソッドを呼ぶ。
closeDialog private void closeDialog()
dialog にsetVisible(false) を設定し、 menuComponentList から removeMenuComponentメソッドでダイアログを削除 。
repaint private void repaint()
this.dialog.getScrollPane().repaint();
this.dialog.repaint();


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