我一直在试图弄清楚如何让两个节点感知它们何时彼此靠近,然后拼接在一起但无法使其正常工作。基本上,我有一个AnchorPane,我将新节点放到上面。新节点也是其他几个组件的锚点窗格。当我放下节点沿外边缘保存锚点时。然后,当我拖动旁边的另一个节点时,两侧将亮起,表明另一个节点处于范围内。JavaFX接近检测不起作用
我正在尝试使正在被拖到另一个节点的节点捕捉到该节点。我似乎无法获得彼此之间正确翻译的坐标,而我只是随机放置和边缘检测而结束。
这里是我的代码,我现在的储蓄锚点的节点:
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
}
我简化了上面的if语句,因为我使用数组存储和调用锚点。
这是我所看到的图像:
你可以看到浅黄色的亮点,当我拖动一个节点比其他当它被抵消。当它位于第二个图像的位置时,它应该检测到另一个节点。我的下一个问题是试图让他们捕捉到正确的坐标。
droppedKromaDevice.setLayoutX(parentKromaDevice.getLayoutX());
droppedKromaDevice.setLayoutY(parentKromaDevice.getLayoutY() - droppedKromaDevice.getBoundsInParent().getHeight());
我试图上述与两个getLayoutX()和localToParent(0,0).getX()和它们产生相同的结果。如果我放置两个与实际工作尺寸完全相同的节点,但是如果它们的大小完全不同,则会使它们彼此偏移。如果我从y中减去高度,那么它的大小应该很重要。
请帮忙。我一直试图让这个工作正确地工作3天,并尝试了我所能想到的一切。
更新:
我想通了,我接近问题。新节点的布局没有正确设置。在保存新节点的锚点之前,我尝试过使用Platform.runLater,但没有任何影响。我通过设置窗格中所有节点的锚点来修复它,当我单击一个节点来拖动它时。这正确保存了锚点。
但是,这并没有解决我的问题,不同大小的节点不能在窗格中正确布局。以下是两个相同尺寸的节点正确对齐的屏幕截图,两个不同尺寸的节点不会正确对齐。数学应该是一样的,这是没有意义的。
这里是设置布局下降相对于其他节点的节点代码:
droppedKromaDevice.setLayoutX(parentKromaDevice.getLayoutX());
droppedKromaDevice.setLayoutY(parentKromaDevice.getLayoutY() - droppedKromaDevice.getBoundsInParent().getHeight());