2013-12-19 29 views
1

我一直在试图弄清楚如何让两个节点感知它们何时彼此靠近,然后拼接在一起但无法使其正常工作。基本上,我有一个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语句,因为我使用数组存储和调用锚点。

这是我所看到的图像:

Wrong LayoutShould 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

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

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

其次,为了使捕捉定位准确工作,我不得不将它们的布局建立在相反锚点之间的三角形上,而不是在节点的边界上。基本上,我得到当前正在丢弃的节点的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]);