【发布时间】:2017-08-13 12:16:25
【问题描述】:
我有一个窗格 (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 的窗格中移动绝对定位的节点?
【问题讨论】:
-
如果您需要移动
Nodes,切勿使用StackPane。