Java Drawing DrawTop

Language

JP  US  UK

 

部品ライブラリ

 H. Jyounishi, Tokyo Japan
 

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

クラス: ComponentLibDialog, ComponentAction, ComponentManager, ComponentLibPanel, TransferableComponent
Unit Test =>DrawTest 部品ライブラリ

1. 概要
1.1 操作
=> 操作説明書 図形ライブラリ
∙ 作成した図形を部品としてライブラリに登録できる。もちろんライブラリからの削除もできる。
∙ 複数の図形を選択してライブラリに登録すると、一個づつ部品として登録される。複数図形を1つの部品として登録するにはグループ化する。
∙ 部品ダイアログを開くと、登録した部品が全て表示される。
∙ 部品の並べ替え

ダイアログ上選択する部品の上でマウスボタンを押しマウスをドラッグすると、 移動先に黒い縦線が表示される (図 1.3 (a))。このときにマウスボタンを離すと、 その位置に選択した部品が配置される (図 1.3 (a))。  ∙ ダイアログ上の部品をDrag and Drop(DnD)操作で描画画面(Canvas)上へ移動すると、 描画画面上に部品と同じ図形が作成される (図 1.4)。
: Drag and Drop(DnD)操作
部品上でマウスボタンを押し、ボタンを押したままマウスを移動(Drag)し、描画画面上でマウスボタンを離す操作。
 


図1.1 部品ライブラリダイアログ

多角形 多角形 グループ図形

図 1.2 部品を選択して主画面に作成した図形

(a) 部品(黒枠内)をマウスドラッグアンドドロップで移動(太い縦線位置) (b) 選択した部品を先頭へ移動した結果

図 1.3 部品をマウスドラッグアンドドロップ操作で移動


図 1.4 マウスドラッグアンドドロップ操作で描画画面上に部品図形を作成


1.2 ツールチップ(Tooltip) 

操作が複雑なので部品ライブラリパネルとボタンには、特別なツールチップを設定している。 マウスボタンをかざしてツールチップが表示される時間も標準に比べると長く60秒に設定してある。


図 1.5 部品ライブラリパネルとボタンのツールチップ


2. ComponentLibDialogクラス 戻る=>page top
public class ComponentLibDialog extends JDialog
部品ライブラリはComponentLibraryという名前のファイルに書き込みContainerManegerのメソッドでアクセスする。。
フィールド
説明
action
ComponentAction action
コンストラクタでComponentActionオブジェクトを設定。
componentManager
ComponentManager componentManager
コンストラクタでComponentManagerオブジェクトを設定。
componentLibPanel
ComponentLibPanel componentLibPanel
コンストラクタでComponentLibPanelオブジェクトを設定。
messageLabel1
JLabel messageLabel1
メッセージ表示ラベルを設定する。このラベルにはshowMessageメソッドで文字列を表示する。
messageLabel2
JLabel messageLabel2
メッセージ表示ラベルを設定する。 このラベルにはshowMessageメソッドで文字列を表示する。 showMessageメソッドの引数 messageに"\n"(改行) が含まれているときに、"\n"以降の文字列をこのラベルに表示する。
addButton
JButton addButton
部品をライブラリに登録するボタンを設定。
deleteButton
JButton deleteButton
部品をライブラリから削除するボタンを設定。
scrollPane
JScrollPane scrollPane
このダイアログのスクロールペインを設定。

メソッド
説明
コンストラクタ
public ComponentLibDialog(int commandId)
ComponentDialog補助クラスをインスタンス化し、フィールド変数に設定。
createDialogメソッドを呼んで、画面に表示するダイアログを作成する。
createDialog
public void createDialog()
メッセージパネル、スクロールペイン、ボタンパネルをjavax.swing.Boxオブジェクトを使って配置する。
[特記事項]
∙ ダイアログにWindowListenerを設定する。
ダイアログが閉じられる時にwindowClosing メソッドが呼ばれる。
∙ 必要なコンポーネントをダイアログに加える(図 1.1)
setButtonAttribute
private void setButtonAttribute(JButton button, String actionCommand, ActionListener action, Dimension dimension)
ボタンに属性、リスナーを設定する。
引数:
button - JButtonオブジェクト
actionCommand - buttonに設定されるアクションコマンド
action - buttonに設定されるActionLisner
dimension - ボタンのサイズ
showDialog
public void showDialog()
ダイアログを次の手順で表示する∙
∙ 部品ライブラリファイル(ComponentManager)から 部品データを読み込む。
ComponentLibPanelに部品データを登録する。これ以降、部品がダイアログに表示される。
∙ スクロールペインのサイズ設定(setPreferredSize)。
∙ ダイアログを表示位置決定。
∙ ダイアログを表示
this.pack();
this.setVisible(true);
showMessage
public void showMessage(String message, Color color)
メッセージラベルにメッセージテキストを表示。
引数:
massage - メッセージテキスト
color - messageの色
処理:
メッセージテキストをmessageLabel1messageLabel2に表示する。
もし"\n"(改行)がメッセージテキストに含まれていたら、"\n"以降の文字列を messageLabel2に表示する。
getName
public String getName()
"LIB"を返す。
setSelected
public void setSelected(boolean selected) 何もしない。
isSelected
public boolean isSelected()
常にfalseを返す。
getSelectedComponent
public ShapeContainer getSelectedComponent()
ComponentLibPanel選択図形データを返す。

getContainerManager
protected ContainerManager getContainerManager()
部品の図形データを管理するContainerManagerオブジェクトを返す。
getComponentLibPanel
protected ComponentLibPanel getComponentLibPanel()
部品をダイアログに表示する ComponentLibPanel オブジェクトを返す。
getComponentManager
protected ComponentManager getComponentManager()
部品データのファイルIOを行うComponentManagerオブジェクトを返す。
getScrollPane
protected JScrollPane getScrollPane()
スクロールペインオブジェクトを返す。
getDialog
protected JDialog getDialog()
ダイアログオブジェクトを返す。ComponentDialogオブジェクトそのもの。

3. ComponentActionクラス 戻る=>page top
class ComponentAction extends AbstractAction implements WindowListener
このクラスはダイアログ上のボタン (addButton, deleteButton) のアクションイベントとウィンドウイベントを処理する。
フィールド
説明
dialog
ComponentLibDialog dialog
Sets the ComponentLibDialog object.

メソッド
説明
actionPerformed
public void actionPerformed(ActionEvent e)
∙ "add component"ボタンを押したとき
 addComponentメソッドを呼ぶ。
∙ "delete component"ボタンを押したとき
 deleteComponentメソッドを呼ぶ。

addComponent
private void addComponent()
主画面で選択図形を部品として登録する。
選択図形のcloneを作る。
∙ 主画面の部品をダイアログの表示用セルに表示できるサイズまで縮小する。ShapeElementIFのresizeメソッド。
∙ 部品データを管理するContainerManagerで部品リストに書き込む。
ComponentManger.writeComponentListメソッドでComponentLibraryファイルに書き込む。
∙ 次の2行でComponentLibPanelを再描画する。revalidateを呼ばないとパネルのサイズが更新されない。
 componentLibPanel.revalidate();
 componentLibPanel.repaint();
deleteComponent
private void deleteComponent()
ダイアログ上で選択した部品をライブラリから削除する。
∙ JOptionPane.showConfirmDialogで削除の確認メッセージを出す。
∙ 部品データを管理するContainerManagerで選択部品を削除する。
ComponentManger.writeComponentListメソッドでComponentLibraryファイルに書き込む。
∙ 次の2行でComponentLibPanelを書き直す。revalidateを呼ばないとパネルのサイズが更新されない。
 componentLibPanel.revalidate();
 componentLibPanel.repaint();
closeDialog
private void closeDialog()
ダイアログを閉じる処理を行う。MenuUtilのremoveDrawMenuメソッドを呼んで、メニューリストからこのダイアログを削除する。これはダイアログが閉じているときには、部品を主画面で作成できないようにするためである。
windowClosing
public void windowClosing(WindowEvent e)
Windowリスナーのメソッド。このメソッドが呼ばれたときにcloseDialogメソッドを呼ぶ。


4. ComponentManagerクラス 戻る=>page top
部品ライブラリファイル(ComponentManager)への入出力を行う。
フィールド
説明
containerManager
ContainerManager containerManager
部品ライブラリを管理するContainerManagerオブジェクトを設定。
drawFileIo
DrawFileIo drawFileIo
部品ライブラリをファイルIOを行うDrawFileIoオブジェクトを設定する。
filePath
String filePath
部品ライブラリファイルのファイルパス名。
version
String version="ver0.0"
ファイルデータ形式のバージョン。

メソッド
説明
コンストラクタ
ContainerManagerオブジェクト作成
filePathフィールドの設定
getContainerManager
public ContainerManager getContainerManager()
ContainerManagerオブジェクトを返す。
writeComponentList
public void writeComponentList()
部品データを格納したArrayListをファイルに書き込む。
DrawFileIo.writeContainerListメソッドを使う。
readComponentList
public void readComponentList()
部品データのファイルを読み込み、ArrayListにセットする。
DrawFileIo.readContainerListメソッドを使う。
moveComponent
public void moveComponent(int selectedComponent, int moveTo)
部品のダイアログ上での表示位置を変える。これは部品を管理するContainerManagerのリストでの位置を変えることである。


5. ComponentLibPanelクラス 戻る=>page top
public class ComponentLibPanel extends JPanel implements MouseListener, MouseMotionListener,
DragGestureListener, DropTargetListener
このクラスは、ComponentLibDialogのスクロールペイン(scrollPane)のViewとして設定されるパネルである。次の機能を持つ。
∙ 部品を格子の小さな升目に表示する。
∙ 選択した部品を囲む黒枠を表示する。
∙ 選択した部品を押さえたままマウスを動かすと、移動先に黒の縦線を表示する。移動先でマウスボタンを離すと、選択した部品をそこに移動する(図1.3)。
∙ 選択した部品を押さえたままマウスを描画画面上に動かしてマウスボタンを離すと、移動先に選択した部品を作成する(図1.4)。
フィールド
説明
sizeOfComponent
final Dimension sizeOfComponent
部品の表示サイズ。
xGap
final int xGap=12;
部品を表示する升目のx間隔。
yGap
final int yGap=12;
部品を表示する升目のy間隔。
xNum
final int xNum=8;
ダイアログのx方向に配置する部品数。xNumは固定値なのでfinal指定。
yNum
int yNum=0;
ダイアログのy方向に配置する部品数。
components
ShapeContainer[] components
パネルに表示する部品の図形データの配列。setComponentsメソッドで設定される。この設定がされるたびに、部品の表示レイアウトを計算する。
panelSize
Dimension panelSize
このパネルのサイズ。sizeOfComponentとcomponentsの配列数から決まる。
componentRects
Rectangle2D[] componentRects
各部品を表示する升目のデータ。
selectedComponent
int selectedComponent
選択された部品番号(>0)。-1の時は選択無効。
gapIndex
int gapIndex:
部品を表示する升目の間の番号。最初の升目の手前が0。gapIndex=-1の時は無効。
gapIndex>=0ならば、升目の間にpaintメソッドで黒の縦線を表示する。
mToolTip

MultiLineToolTip mToolTip=new MultiLineToolTip(500, 60000);

複数行表示可能なツールチップ。コンストラクタの2つの引数はツールチップを表示するまでのディレイ時間と表示持続時間(単位はミリセカンド) 。


メソッド
説明
コンストラクタ
public ComponentLibPanel()
このパネルにMouseListener, MouseMotionListener, DragGestureListener, DropTargetListenerを設定する。
createToolTip

public JToolTip createToolTip()

MultiLineToolTipオブジェクトを返す。JComponentの同名メソッドの書き換え。

getSizeOfComponent

public Dimension getSizeOfComponent()

sizeOfComponentフィールドの値を返す。

getSelectedComponentByIndex
public int getSelectedComponentByIndex()
選択された部品番号(selectedComponent)を返す。
setSelectedComponentByIndex
public void setSelectedComponentByIndex(int selectedComponent)
選択部品番号を外部から設定する。現在のところ部品を削除したときに-1を設定するのに使っているだけである。
getSizeOfScrollPane
public Dimension getSizeOfScrollPane()
このパネルのサイズを少し大きくしたサイズを返す。ComponentLibDialogのshowDialogメソッドで参照し、setPreferredSizeでスクロールペインのサイズを設定している。
paint
public void paint(Graphics g)
paintメソッドでは、次の描画を行う。
①部品を囲む灰色の細い枠。
②その部品が選択されているときに、部品を囲む太い枠。
③this.gapIndex>=0と時に、部品の間に太い縦線。
④部品の図形:次のdrawComponentメソッドで描画する。
setComponentPanel
private void setComponentPanel()
このパネルのレイアウトを部品数から計算する。
計算される値は、フィールド変数yNum、panelSize、componentRects。
drawComponent
private void drawComponent(Graphics g, int i, Rectangle2D rect)
引数:
int page - 表示する部品の番号(0,1,2....)
Rectangle2D rect - 部品の表示領域。フィールド変数componentRects[i]が渡される。
dragGestureRecognized

public void dragGestureRecognized(DragGestureEvent e)

DragGestureListenerインターフェイスが定義するメソッド。
選択されている部品の図形データをTransferableComponentにセットしてDragGestureEventのstartDragメソッドを呼ぶ。

drop

public void drop(DropTargetDropEvent e)

DragTargetListenerインターフェイスが定義するメソッド。

Drag and Drop操作のDrop位置がComponentLibPanel上であるか否かをチェックし、上である場合は部品の移動を行う処理を行う。このためMouseListenerの mouseReleasedメソッドを呼ぶ。

:元々、部品の移動処理はmouseReleasedメソッドで行っていたが、DragGestureListenerをインプリメントすると、mouseReleasedメソッドは正しく動作しなくなる。このためこのdropメソッドから呼びだすことにしている。

dragOver

public void dragOver(DropTargetDragEvent e)

MouseListenerの mouseDraggedメソッドを呼ぶ。

:DragGestureListenerをインプリメントすると、mouseDraggedメソッドは正しく動作しなくなる。このためこのdropメソッドから呼びだすことにしている。

mousePressed
public void mousePressed(MouseEvent e)
このクラスのptInsideメソッドでマウスの現在位置を含む部品番号を求める。部品番号があればそれを選択された部品とし、selectedComponentにセットする。なければselectedComponent=-1。
mouseDragged
public void mouseDragged(MouseEvent e)
このクラスのgetNearestGapメソッドで現在のマウス位置に最も近い部品間のギャップ番号を求めフィールド変数gapIndexにセット。
このgapIndexは部品の表示位置を変更する際の移動先を表す。
mouseReleased
public void mouseReleased(MouseEvent e)
マウスを離すときに、部品の移動先が決定する。moveComponentメソッドで選択部品ををgapIndexの位置に移動する。
移動後にwriteComponentListメソッドでファイルに書き込む。
mouseClicked
public void mouseClicked(MouseEvent e) なにもしない
mouseEntered
public void mouseEntered(MouseEvent e)  なにもしない
mouseExited
public void mouseExited(MouseEvent e)  なにもしない
mouseMoved
public void mouseMoved(MouseEvent e)  なにもしない
ptInside
public int ptInside(Point2D point)
pointが表示中の部品表示領域(componentRects)のどれかに含まれるかをチェックする。含まれる場合componentRectsの番号を返す。どのcomponentRectsにも含まれないときは-1を返す。
getNearestGap
public int getNearestGap(Point2D point)
pointの最も近いギャップを求めギャップ番号を返す。ギャップ番号(index)は、0番部品の手前がindex=0、後ろで0番部品の手前がindex=1、……である。
moveComponent
private void moveComponent(int selectedComponent, int gapIndex)
部品の表示位置を変更する。部品ライブラリを管理するComponentLibraryでの順序を変更するため、ComponentMangerのmoveComponentメソッドを呼んで処理する。


6. Class TransferableComponent 戻る=>page top
public class TransferableComponent implements Transferable
このクラスは選択された図形データをDrag and Drop操作で転送するために使われる。
フィールド
説明
componentFlavor
public static DataFlavor componentFlavor = new DataFlavor(ShapeContainer.class, "ShapeContainer")
supportedFlavors public static DataFlavor[] supportedFlavors = {componentFlavor}
container ShapeContainer container
転送されるShapeContainerオブジェクトを格納する。

メソッド
説明
コンストラクタ public TransferableComponent(ShapeContainer container)
引数をフィールド変数にセット。
getTransferDataFlavors public DataFlavor[] getTransferDataFlavors()
supportedFlavorsを返す。
isDataFlavorSupported public boolean isDataFlavorSupported(DataFlavor flavor)
引数がcomponentFlavorならばtrueを返す。
getTransferData public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException
引数がcomponentFlavorならばフィールド変数containerの値を返す。


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