我有一个窗格(1440x800)和一个节点(400x300),我需要在此窗格中移动。所以对于Pane我拿了StackPane,而Node我拿了VBox。
这是移动节点的控制器。
public class Controller extends AbstractController {
/**
* Mouse pressed X position.
*/
private double mousePressedX;
/**
* Mouse pressed Y position.
*/
private double mousePressedY;
/**
* Insets that were when user pressed mouse.
*/
private Insets mousePressedInsets;
/**
* Mouse pressed handler.
* @param event
*/
@FXML
public void handleTitlePaneMousePressed(final MouseEvent event) {
Node node = (Node) getView().getFxView();
mousePressedX = event.getScreenX();
mousePressedY = event.getScreenY();
mousePressedInsets = StackPane.getMargin(node);
if (mousePressedInsets == null) {
mousePressedInsets = new Insets(0, 0, 0, 0);
}
}
/**
* Moused dragged handler.
* @param event
*/
@FXML
public void handleTitlePaneMouseDragged(final MouseEvent event) {
Node node = (Node) getView().getFxView();
double deltaX = event.getScreenX() - mousePressedX;
double deltaY = event.getScreenY() - mousePressedY;
Insets newInsets =
new Insets(mousePressedInsets.getTop() + deltaY, 0, 0, mousePressedInsets.getLeft() + deltaX);
StackPane.setMargin(node, newInsets);
}
}
当用户点击节点的标题时,按下X和Y将被保存并在Moused dragged handler
中使用。代码按我的需要工作。唯一的问题是鼠标移动和节点模式之间存在一点滞后。
我尝试将以下设置添加到JVM
-Djavafx.animation.fullspeed=true
-Dprism.vsync=false
但它没有帮助,也许是因为我使用Linux - 不知道。
是否有另一种更优化的方法在JavaFX的窗格中移动绝对定位的节点?
答案 0 :(得分:0)
您的代码一直在与StackPane的布局机制作斗争。对于节点的绝对定位,您应该始终直接使用窗格。在某些情况下,也可以使用AnchorPane。