Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javafx 2 JavaFX接近检测不工作_Javafx 2 - Fatal编程技术网

Javafx 2 JavaFX接近检测不工作

Javafx 2 JavaFX接近检测不工作,javafx-2,Javafx 2,我一直在试图弄清楚,当两个节点彼此靠近时,如何让它们感知,然后再捕捉在一起,但无法使其正常工作。基本上,我有一个锚,我投下新的节点。新节点也是锚定窗格,上面有几个其他组件。当我放下节点时,我会沿外边缘保存定位点。然后,当我拖动它旁边的另一个节点时,边将亮起,指示另一个节点在范围内 我正在尝试使正在拖动到另一个节点旁边的节点捕捉到该节点。我似乎无法得到彼此之间正确转换的坐标,我只是以随机放置和边缘检测结束 以下是我保存节点锚定点的代码: double kromaDeviceWidth = krom

我一直在试图弄清楚,当两个节点彼此靠近时,如何让它们感知,然后再捕捉在一起,但无法使其正常工作。基本上,我有一个锚,我投下新的节点。新节点也是锚定窗格,上面有几个其他组件。当我放下节点时,我会沿外边缘保存定位点。然后,当我拖动它旁边的另一个节点时,边将亮起,指示另一个节点在范围内

我正在尝试使正在拖动到另一个节点旁边的节点捕捉到该节点。我似乎无法得到彼此之间正确转换的坐标,我只是以随机放置和边缘检测结束

以下是我保存节点锚定点的代码:

double kromaDeviceWidth = kromaDevice.getBoundsInParent().getWidth();
double kromaDeviceHeight = kromaDevice.getBoundsInParent().getHeight();
//This x,y represents the top left corner of the node
double kromaDeviceX = kromaDevice.localToParent(0.0, 0.0).getX();
double kromaDeviceY = kromaDevice.localToParent(0.0, 0.0).getY();

kromaDevice.setTopAnchorPoint(new double[]{kromaDeviceX + kromaDeviceWidth / 2, kromaDeviceY});
kromaDevice.setRightAnchorPoint(new double[]{kromaDeviceX + kromaDeviceWidth, kromaDeviceY + kromaDeviceHeight / 2});
kromaDevice.setBottomAnchorPoint(new double[]{kromaDeviceX + kromaDeviceWidth / 2, kromaDeviceY + kromaDeviceHeight});
kromaDevice.setLeftAnchorPoint(new double[]{kromaDeviceX, kromaDeviceY + kromaDeviceHeight / 2});
最初拖放新节点和拖动节点时的代码相同。然后,我比较两个节点的锚定位置,判断它们是否在范围内:

if (Math.abs(bottomAnchorX - topAnchorPointX) <= ANCHOR_DISTANCE && Math.abs(bottomAnchorY - topAnchorY) <= ANCHOR_DISTANCE) {
    ....show correct edge highlight
}
我用getLayoutX()和localToParent(0,0).getX()尝试了上述方法,它们产生了相同的结果。如果我放置的两个节点的大小与它实际工作时的大小完全相同,但如果它们的大小完全不同,则会将它们彼此偏移放置。如果我从y中减去高度,那么大小应该很重要

请帮忙。我已经试着让它正常工作三天了,我已经尝试了我能想到的一切

更新:

我发现了我的近距离问题。新节点的布局未设置正确。在保存新节点的锚点之前,我尝试过使用Platform.runLater,但没有效果。当我点击一个节点来拖动它时,我通过设置窗格中所有节点的锚点来修复它。这正确地保存了锚点

但是,这并没有解决不同大小的节点在窗格中布局不正确的问题。下面是两个相同大小的节点正确捕捉在一起的屏幕截图,以及两个不同大小的节点未正确捕捉的屏幕截图。这毫无意义,因为数学应该是一样的

以下是用于设置放置的节点相对于其他节点的布局的代码:

droppedKromaDevice.setLayoutX(parentKromaDevice.getLayoutX());
droppedKromaDevice.setLayoutY(parentKromaDevice.getLayoutY() - droppedKromaDevice.getBoundsInParent().getHeight());

我找到了两个问题的解决办法

首先,当我创建新节点并将它们放到面板上时,边界没有得到正确的计算,因此我的锚定点被关闭。我只是改变了它,所以当我点击一个节点来拖动它时,我会在面板上的所有其他节点中循环并构建它们的锚,而不是在我第一次拖放/创建它时

其次,为了使捕捉定位准确工作,我必须将它们的布局基于相对锚点之间的增量,而不是节点的边界。基本上,我得到我要删除的节点的当前x/y,然后使用删除的节点和我需要捕捉到的节点之间的增量移动它。下面的代码是我使用的。0表示阵列中的x坐标,1表示阵列中的y坐标

droppedKromaDevice.setLayoutX(droppedKromaDevice.getLayoutX() - droppedKromaDevice.getBottomAnchorPoint()[0] + parentKromaDevice.getTopAnchorPoint()[0]);
droppedKromaDevice.setLayoutY(droppedKromaDevice.getLayoutY() - droppedKromaDevice.getBottomAnchorPoint()[1] + parentKromaDevice.getTopAnchorPoint()[1]);
droppedKromaDevice.setLayoutX(droppedKromaDevice.getLayoutX() - droppedKromaDevice.getBottomAnchorPoint()[0] + parentKromaDevice.getTopAnchorPoint()[0]);
droppedKromaDevice.setLayoutY(droppedKromaDevice.getLayoutY() - droppedKromaDevice.getBottomAnchorPoint()[1] + parentKromaDevice.getTopAnchorPoint()[1]);