在学校里复习完数据结构的树结构后,想使用 JavaFX 把树给画出来,其中树的结点我希望做成可拖拽,这里简单记录下 JavaFX 的鼠标拖拽。
拖拽是 GUI 中常见的用户交互,经常通过将鼠标指针变为手势来提醒用户某个结点可点击:
而当用户点击鼠标(准确来说是指按压鼠标不放)时,鼠标指针将变为十字来提醒用户该结点可拖拽:
上诉两种鼠标指针变化都很简单,只要在相应的事件处理器中进行设置即可:
public class DraggableDemo extends Application {
private void draggable(Node node) {
// 提示用户该结点可点击
node.addEventHandler(MouseEvent.MOUSE_ENTERED, event -> node.setCursor(Cursor.HAND));
node.addEventHandler(MouseEvent.MOUSE_EXITED, event -> node.setCursor(Cursor.DEFAULT));
// 提示用户该结点可拖拽
node.addEventHandler(MouseEvent.MOUSE_PRESSED, event -> node.setCursor(Cursor.MOVE));
node.addEventHandler(MouseEvent.MOUSE_RELEASED, event -> node.setCursor(Cursor.DEFAULT));
// ... 剩余代码 ...
}
}
下面实现结点的拖拽,这里以 X 轴为参考进行说明:
在图中,我们要计算的未知数是 x(y 轴方向上的变量暂时不考虑),其中 x = layoutX + distanceX 。另外在用户按压鼠标时,我们需要缓存一下按压事件所发生的位置坐标。下面来实现结点的拖拽功能,变量 y 的计算方式与 x 类似。
我们首先写一个内部类Position专门用来表示坐标:
public class DraggableDemo extends Application {
privat