|
1. ソースコードダウンロード
=>
ComponentLib.zip
2. テスト項目
(1)部品をドラッグアンドドロップ(Drag and Drop)操作で移動する(図1)
(2)部品をドラッグアンドドロップ(Drag and Drop)操作で描画画面にコピーし新しい図形を作成する(図2)。
(注)"add component", "del component"ボタンはこのテストコードでは無効である。
|
|
(a) 部品(黒枠内)をドラッグアンドドロップで移動(太い縦線位置) |
(b)部品を先頭へ移動した結果 |
図1 選択した部品をドラッグして表示位置を変更 |
|
図 2 ドラッグアンドドロップ操作で描画画面上に部品図形を作成 |
3. テストコード
コンポーネント
|
説明
|
DrawMain
|
メインクラス
・部品の図形データを作成する。矩形と楕円だけ。
・ComponentLibDialog のshowDialogメソッドでダイアログを表示する。
|
ObjectTable |
主要オブジェクトを登録する。
例えばObjectTable.getComponentLibDialog()でComponentLibDialogオブジェクトを取得する。 |
ComponentLibDialog |
ダイアログを作成し、表示するコード
• addComponent, deleteComponentボタンのアクション処理はインプリメントしない。したがって無効。
• showDialog
this.componentManager.readComponentList();は無効
表示データは次の行で取得する。
ShapeContainer[] containers=this.getContainerManager().getContainers();
|
ComponentLibPanel |
すぐにアプリケーションに組み込めるコード
・部品を表示するパネル。
・マウスのDrag and Drop操作により部品を並べ替えることができる。
・マウスのDrag and Drop操作により部品をDrawPanelにコピーできる。
|
ComponentManager |
テスト用のコード
・部品データをファイル入出力を行うクラスだが、writeComponentList, ReadComponentListメソッドはダミー
・部品を並べ替えを実行するため ArrayListでの順番を変更する。moveComponentメソッド。 |
ContainerManager |
テスト用のコード
・部品データをArrayListに格納する。 |
DrawPanel |
テスト用のコード
・図形描画パネル(キャンバス)
・Drag and Drop操作のDropTargetになる。 |
TransferableComponent |
Drag and Drop操作で転送される部品データ |
ShapeContainer |
テスト用のコード
図形データのコンテナで、このテストに必要な最小限の機能を持つ。次の機能を持つ。
・DrawPanelに図形を表示
・クローン作成
・平行移動
・Id設定可能 |
MultiLineToolTip |
複数行のツールチップ
=>http://www.java2s.com/Code/Java/Swing-JFC/MultiLineToolTipExample.htm |
3. Drag and Drop操作
3.1 部品を移動する(図1)
・関係するクラス: ComponentLibPanelクラス
Drag and Drop操作の場所が"Component Lib"パネルなので"ComponentLibPanelクラスだけが関係する。
コンポーネント
|
説明
|
DragSource
|
DragSourceはComponentLibPanel。
ComponentLibPanelコンストラクタで次のように設定する。
DragSource dragSource = DragSource.getDefaultDragSource();
dragSource.createDefaultDragGestureRecognizer(this, DnDConstants.ACTION_COPY,
this);
|
DropTarget |
DropTargetはComponentLibPanel。
ComponentLibPanelコンストラクタで次のように設定する
DropTarget dropTarget = new DropTarget(this, this);
|
DropSouceListener |
インプリメントしない |
DragGestureListener |
ComponentLibPanelにインプリメント
・dragGestureRecognizedメソッド
部品の図形データをTransferableComponentにセットして、DragGestureEventのstartDragメソッドを呼ぶ
TransferableComponent transfer=new TransferableComponent((ShapeContainer)container.clone());
e.startDrag(DragSource.DefaultCopyDrop, transfer);
|
DropTargetListener |
ComponentLibPanelにインプリメント
(1) dragOverメソッド
MouseListenerのmouseDraggedメソッドを呼ぶ(次の欄を参照)。
(2)dropメソッド
drop位置がComponentLibPanel上か否かチェックする。ComponentLibPanel上ならばMouseListenerのmouseReleasedメソッドを呼ぶ(次の欄を参照)。TransferableComponentにセットされた部品の図形データは参照せず、mousePressedメソッドで決めた移動する部品番号を参照する。
|
MouseListener, MouseMotionListener |
ComponentLibPanelにインプリメント
部品の移動だけならば、この2つのリスナーのメソッドをインプリメントすればできる。しかし3.2を実現するためにDragGestureListenerをインプリメントすると、mouseDragged,
mouseReleasedなどのメソッドが正しく動作しない(mousePressedは正しく動作する)。
そこでmouseDraggedメソッドはDragTargetListener のdragOverメソッドで代用し、このメソッドからmouseDraggedメソッドを呼び出す。
またmouseReleasedメソッドはDragTargetListener のdroprメソッドで代用し、このメソッドからmouseReleasedメソッドを呼び出す。
mousePressedメソッドは、プレス時の座標から移動する部品を選び、部品表示のセルの境界に黒枠を表示する処理に使う。
|
3.2 部品を描画画面にコピーする(図2)
・関係するクラス: ComponentLibPanel, DrawPanelクラス
Drag操作開始位置がComponentLibPanel、Drop場所がDrawPanelなのでComponentLibPanelとDrawPanelクラスが関係する。
コンポーネント
|
説明
|
DragSource
|
DragSourceはComponentLibPanel。
ComponentLibPanelコンストラクタで次のように設定する(3.1と同じ)。
DragSource dragSource = DragSource.getDefaultDragSource();
dragSource.createDefaultDragGestureRecognizer(this, DnDConstants.ACTION_COPY,
this);
|
DropTarget |
DropTargetはComponentLibPanel。
DrawPanelコンストラクタで次のように設定する
DropTarget dropTarget = new DropTarget(this, this);
this.setDropTarget(dropTarget);
|
DropSouceListener |
インプリメントしない |
DragGestureListener |
ComponentLibPanelにインプリメント
・dragGestureRecognizedメソッド(3.1と同じ)
部品の図形データをTransferableComponentにセットして、DragGestureEventのstartDragメソッドを呼ぶ
TransferableComponent transfer=new TransferableComponent((ShapeContainer)container.clone());
e.startDrag(DragSource.DefaultCopyDrop, transfer);
|
DropTargetListener |
DrawPanelにインプリメント
(1) dragOverメソッド
なにもしない
(2)dropメソッド
drop位置がComponentLibPanel上か否かチェックする。ComponentLibPanel上ならば何もせずにリターン。
ComponentLibPanel上でなければ、TransferableComponentにセットされた部品の図形データを取得し、ContainerManagerに書き込む。またDrop位置に図形を表示するために、図形データをDrop位置に平行移動する。ContainerManagerに書き込むとrepaint()メソッドで、DrawPanelに図形が表示される。
|
MouseListener, MouseMotionListener |
何もしない。
|
|