简体   繁体   English

JavaFX拖动旋转节点

[英]JavaFX drag rotated node

In JavaFX I'm trying to move a node by clicking and dragging it. 在JavaFX中,我试图通过单击并拖动来移动节点。 It works well if the node isn't rotated, but when i rotate it it starts to behave weirdly. 如果不旋转节点,则效果很好,但是当我旋转节点时,它的行为就变得怪异了。

At around 45° it starts to jitter when I move it, at 60° it jerks back and forth violently. 当我移动它时,在45°左右它开始抖动,在60°时它剧烈地来回抖动。 And at 90° the Node flies of the screen as soon as I start to move it. 当我开始移动它时,Node会以90°飞过屏幕。

Here is the code that I use to rotate and move the node. 这是我用来旋转和移动节点的代码。 It's from a MouseListener connected to the node. 它来自连接到该节点的MouseListener。

if( event.getEventType() == MouseEvent.MOUSE_RELEASED) {
    ( this.lastEvent == MouseEvent.MOUSE_PRESSED ) {
        if(getRotate() == 0) {
            setRotate(90d);
        } else {
            setRotate(0d);
        }
    }
}
if( event.getEventType() == MouseEvent.MOUSE_DRAGGED ) {
    if(getRotate() == 0) {
        setTranslateX( getTranslateX() + event.getX() );
        setTranslateY( getTranslateY() + event.getY() );
        System.out.print(" trX: " + getTranslateX());
        System.out.print(" evX: " + event.getX());
        System.out.println(" evY: " + event.getY());
    } else {
        setTranslateX(getTranslateX() + event.getX() );
        setTranslateY(getTranslateY() + event.getY() );
        System.out.print(" trX: " + getTranslateX());
        System.out.print(" evX: " + event.getX());
        System.out.println(" evY: " + event.getY());
    }
}

Edit: Here is some sample output, as well as picture showing the different nodes. 编辑:这是一些示例输出,以及显示不同节点的图片。

Output when not rotated and moving slowly to the left: 不旋转并缓慢向左移动时的输出:

 trX: 333.0 evX: -1.0 evY: 0.0
 trX: 333.0 evX: 0.0 evY: -1.0
 trX: 332.0 evX: -1.0 evY: 0.0
 trX: 332.0 evX: 0.0 evY: -1.0
 trX: 331.0 evX: -1.0 evY: 0.0
 trX: 330.0 evX: -1.0 evY: -1.0
 trX: 330.0 evX: 0.0 evY: 1.0

Output when moving slowly to the left while rotated: 旋转时缓慢向左移动时的输出:

 trX: 102.0 evX: 142.0 evY: -245.0
 trX: 489.0 evX: 387.0 evY: -102.0
 trX: 978.0 evX: 489.0 evY: 286.0
 trX: 1181.0 evX: 203.0 evY: 776.0
 trX: 607.0 evX: -574.0 evY: 979.0
 trX: -947.0 evX: -1554.0 evY: 405.0
 trX: -2905.0 evX: -1958.0 evY: -1149.0
 trX: -3714.0 evX: -809.0 evY: -3106.0
 trX: -1417.0 evX: 2297.0 evY: -3914.0
 trX: 4795.0 evX: 6212.0 evY: -1617.0
 trX: 12623.0 evX: 7828.0 evY: 4595.0
 trX: 15857.0 evX: 3234.0 evY: 12423.0
 trX: 6668.0 evX: -9189.0 evY: 15658.0
 trX: -18180.0 evX: -24848.0 evY: 6469.0
 trX: -49497.0 evX: -31317.0 evY: -18378.0
 trX: -62436.0 evX: -12939.0 evY: -49694.0
 trX: -25681.0 evX: 36755.0 evY: -62632.0
 trX: 73706.0 evX: 99387.0 evY: -25876.0
 trX: 198969.0 evX: 125263.0 evY: 73512.0
 trX: 250720.0 evX: 51751.0 evY: 198776.0
 trX: 103694.0 evX: -147026.0 evY: 250526.0
 trX: -293858.0 evX: -397552.0 evY: 103501.0
 trX: -794910.0 evX: -501052.0 evY: -294051.0
 trX: -1001912.0 evX: -207002.0 evY: -795103.0
 trX: -413811.0 evX: 588101.0 evY: -1002104.0

And here is aa picture of the program: 这是该程序的图片:
程序图片

The outer box is the 'parent' Node, while the inner black box with the text "Not a Gnome" is the node I'm trying to move. 外框是“父”节点,而带有文本“ Not Gnome”的内黑框是我要移动的节点。 The mouse event listener is added to the inner node. 鼠标事件侦听器将添加到内部节点。

I finally came up with a solution myself. 我终于自己想出了一个解决方案。

Instead of moving the Node based on where the mouse is based on its position the instance before, I now calculate how much it has changed with coordinates from the scene. 现在,我不再计算节点根据实例之前的位置移动节点,而是计算它随场景坐标的变化量。

Here is the updated code, everything about context is the same as in the question. 这是更新的代码,有关上下文的所有内容与问题中的相同。

if( event.getEventType() == MouseEvent.MOUSE_PRESSED ) {
    this.mouseInSceneX = event.getSceneX();
    this.mouseInSceneY = event.getSceneY();

    Card.this.setCursor(Cursor.MOVE);
}
if( event.getEventType() == MouseEvent.MOUSE_DRAGGED ) {
    double xChange = event.getSceneX() - mouseInSceneX;
    double yChange = event.getSceneY() - mouseInSceneY;

    setTranslateX(getTranslateX() + xChange);
    setTranslateY(getTranslateY() + yChange);

    mouseInSceneX = event.getSceneX();
    mouseInSceneY = event.getSceneY();

    System.out.print(" trX: " + Card.this.getTranslateX());
    System.out.print(" trY: " + Card.this.getTranslateY());
    System.out.print(" cgpX: " + mouseInSceneX);
    System.out.print(" cgpY: " + mouseInSceneY);
    System.out.println(); 
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM