1. 程式人生 > >Java swing拖拽移動元件.

Java swing拖拽移動元件.

首先構造自己的元件,如..Component extends JComponents { ... }。在裡面新增拖拽方法

DragSource dragSource = DragSource.getDefaultDragSource();
dragSource.createDefaultDragGestureRecognizer(this, DnDConstants.ACTION_MOVE, new DragGestureListener() {
	...
}

在父容易裡,如..Panel extends JPanel { ...} 新增拖拽實現。

new DropTarget(this, DnDConstants.ACTION_MOVE,  new DropTargetAdapter() {
	@Override
	public void drop(DropTargetDropEvent dtde) {
		...
	}
}


最後還有一個...Transferable implements Transferable { ..}

如果在...Transferable裡傳遞..Component物件,在..Panel的drop方法裡取得..Component後,呼叫..Component.setLocation是不能移動元件的。原因是拖拽會將...Transferable從新序列化,得到一個新的..Component元件,因為..Component繼承了Component,而在Component裡的parent是transient,所以拖拽後,新..Component和..Panel容器不會產生關聯,setLocation方法不起作用。

所以只要在..Transferable裡傳遞一些標識性,drop裡得到原物件引用即可解決拖拽移動,還可以順便傳遞原座標。

     

左圖中,右下移動過程中有一個滑鼠的拖拽游標,右圖為移動完成後