部品ライブラリ - Drag and Drop操作
2012.09.16

Language

トピックス

閉じた図形のマウスヒットテスト
2010.08.26


閉じていない図形のマウスヒットテスト
2010.08.26


任意2曲線の交点計算
2010.09.01


点から曲線への垂線の計算
2010.09.01


2曲線への共通垂線の計算
2016.10.20


Input Method Frameworkによる
テキストエディター
2010.12.01


部品ライブラリ
2012.09.16


専用カラーチューザー
2012.9.23



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

何もしない。


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