JavaFX接近检测不起作用

时间:2013-12-19 08:45:55

标签: javafx-2

我一直试图弄清楚如何让两个节点感知它们何时彼此靠近然后拼接在一起却无法正常工作。基本上,我有一个AnchorPane,我正在删除新节点。新节点也是锚定窗格,其上还有其他几个组件。当我删除节点时,我沿着外边缘保存锚点。然后,当我拖动旁边的另一个节点时,两侧将亮起,表示另一个节点在范围内。

我试图让一个被拖动到另一个节点旁边的节点捕捉到该节点。我似乎无法让坐标在彼此之间正确平移,而我最终只能进行随机放置和边缘检测。

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

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语句,因为我使用数组来存储和调用锚点。

这是我所看到的图像:

Wrong Layout Should Detect Here

当我将一个节点拖到另一个节点上时,您可以看到略微的黄色突出显示。当它处于第二个图像中的位置时,它应检测另一个节点。我的下一个问题是试图让它们捕捉到正确的坐标。

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

我使用getLayoutX()和localToParent(0,0).getX()尝试了上述操作,它们产生相同的结果。如果我放置两个节点,它们的大小与它实际工作的大小完全相同,但如果它们的大小不同,那么它们会相互偏移。如果我从y中减去高度,它应该与大小有关。

请帮忙。我一直试图让它正常工作3天,并尝试了我能想到的一切。

更新

我想出了我的邻近问题。新节点的布局未正确设置。我在保存新节点的锚点之前尝试做一个Platform.runLater,但没有任何影响。我通过在单击节点上拖动它时为窗格中的所有节点设置锚点来修复它。这正确地保存了锚点。

然而,这并没有解决我的问题,即不正确地在窗格中布局的不同大小的节点。下面是两个相同大小的节点正确捕捉的截图,两个不同大小的节点没有正确捕捉。这没有任何意义,因为数学应该是相同的。

Layout example

以下是设置被删除节点相对于另一个节点的布局的代码:

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

1 个答案:

答案 0 :(得分:1)

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

首先,当我创建新节点并将其放在面板上时,未正确评估边界,因此我的锚点已关闭。我只是改变了它,所以当我点击一个节点拖动它时,我循环遍历面板上的所有其他节点并构建它们的锚点,而不是在我第一次删除/创建它时。

其次,为了使快照定位准确工作,我不得不将它们的布局基于相对锚点之间的增量而不是节点的边界。基本上,我得到了我正在删除的节点的当前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]);