Java swing拖拽移動元件.
阿新 • • 發佈:2018-12-31
首先構造自己的元件,如..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裡得到原物件引用即可解決拖拽移動,還可以順便傳遞原座標。
左圖中,右下移動過程中有一個滑鼠的拖拽游標,右圖為移動完成後