Java swing拖拽移动组件.

时间:2023-01-26 18:55:17

首先构造自己的组件,如..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里得到原对象引用即可解决拖拽移动,还可以顺便传递原坐标。

    Java swing拖拽移动组件. Java swing拖拽移动组件.

左图中,右下移动过程中有一个鼠标的拖拽光标,右图为移动完成后