2013-12-19 5 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 
} 

나는 위를 단순화하면 내가 저장하고 앵커 포인트를 불러 배열을 사용하고 같은 문. 여기

내가보고있는 무슨의 이미지입니다 :

Wrong LayoutShould Detect Here

가 상쇄 될 때 나는 다른 통해 하나 개의 노드를 드래그 할 때 당신은 약간의 노란색 하이라이트를 볼 수 있습니다. 다른 노드가 두 번째 이미지의 위치에있을 때 다른 노드를 감지해야합니다. 다음 문제는 올바른 좌표로 스냅하려고합니다.

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

난 .getX()를 getLayoutX() 및 localToParent (0,0) 모두 위를 시도하고 동일한 결과를 생성한다. 만약 내가 실제로 작동하는 것보다 정확히 크기가 같은 두 개의 노드를 배치하지만, 서로 다른 크기가 있다면 그것들은 서로 오프셋되어 있습니다. y에서 높이를 빼면 크기가 중요합니다.

도와주세요. 나는 이것을 지금 3 일 동안 올바르게 작동 시키려고 노력해 왔으며 내가 생각할 수있는 모든 것을 시도했다.

업데이트 : 내 근접 문제를 파악

. 새 노드의 레이아웃이 올바르게 설정되지 않았습니다. 새 노드의 앵커 포인트를 저장하기 전에 Platform.runLater를 시도했지만 아무런 영향을 미치지 않았습니다. 드래그 할 노드를 클릭 할 때 창에있는 모든 노드의 기준점을 설정하여 고정했습니다. 그 결과 앵커 포인트가 올바르게 저장되었습니다.

그러나 이것은 다른 크기의 노드가 창에 제대로 배치되지 않는 문제를 수정하지 않았습니다. 다음은 같은 크기의 두 노드가 올바르게 결합 된 화면과 다른 크기의 두 노드가 올바르게 맞지 않는 화면입니다. 수학이 동일해야하기 때문에 이것은 의미가 없습니다.

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

답변

1

나는 내 두 문제의 해결책을 발견 : 여기

Layout example

다른 노드로 떨어 노드 상대의 레이아웃을 설정하는 코드입니다.

첫 번째로, 새 노드를 만들고 패널에 놓으면 경계가 올바르게 평가되지 않아서 앵커 포인트가 해제되었습니다. 방금 노드를 클릭하여 노드를 드래그하여 패널의 다른 모든 노드를 반복하고 대신 앵커를 작성합니다. 처음 앵커를 놓거나 만들 때 대신 앵커를 작성합니다.

둘째로, 스냅 위치 지정을 정확하게 수행하려면 노드의 경계가 아닌 반대 앵커 포인트 사이의 델타에서 배치해야합니다. 기본적으로 노드의 현재 x/y를 가져오고 삭제 된 노드와 노드를 스냅해야하는 노드 사이의 델타를 사용하여 노드를 이동합니다. 아래 코드는 제가 사용했던 코드입니다. 0은 x 좌표를 나타내며 1은 배열의 y 좌표를 나타냅니다.

관련 문제