在JavaFX中在Pane中移动绝对定位节点的最佳方法是什么?

时间:2017-08-13 12:16:26

标签: java javafx

我有一个窗格(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的窗格中移动绝对定位的节点?

1 个答案:

答案 0 :(得分:0)

您的代码一直在与StackPane的布局机制作斗争。对于节点的绝对定位,您应该始终直接使用窗格。在某些情况下,也可以使用AnchorPane。