首先构造自己的组件,如..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里得到原对象引用即可解决拖拽移动,还可以顺便传递原坐标。
左图中,右下移动过程中有一个鼠标的拖拽光标,右图为移动完成后