gpt4 book ai didi

JavaFX拖动旋转节点

转载 作者:行者123 更新时间:2023-12-01 11:05:08 25 4
gpt4 key购买 nike

在 JavaFX 中,我尝试通过单击并拖动节点来移动节点。如果节点不旋转,它工作得很好,但是当我旋转它时,它开始表现得很奇怪。

在 45° 左右时,当我移动它时,它开始抖动,在 60° 时,它会剧烈地来回抖动。当我开始移动 Node 时,它​​就会以 90° 的角度飞出屏幕。

这是我用来旋转和移动节点的代码。它来自连接到节点的 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());
}
}
<小时/>

编辑:这是一些示例输出,以及显示不同节点的图片。

不旋转且向左缓慢移动时的输出:

 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

旋转时向左缓慢移动时的输出:

 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

这是该程序的图片:
Picture of program

外部框是“父”节点,而带有文本“Not a Gnome”的内部黑框是我要移动的节点。鼠标事件监听器被添加到内部节点。

最佳答案

我终于自己想出了一个解决方案。

现在,我不再根据鼠标所在的位置移动节点(基于实例之前的位置),而是计算节点随场景坐标的变化量。

这是更新后的代码,有关上下文的所有内容都与问题中的相同。

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();
}

关于JavaFX拖动旋转节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33043173/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com