2017-05-04 26 views
0

JavaFX에서 이미지 도구의 두 점을 클릭 한 다음 그 사이의 거리를 가져 오는 데 사용할 JavaFX에서 측정 도구를 만들려고합니다. 밖으로 나간다. 그러나 나는 또한 내가 클릭 한 이미지의 위치를 ​​보거나 표시 할 수 있기를 원하지만 그렇게하는 것이 최선이라고 생각할 수 없다. 측정 도구의 코드를 첨부하여 내가 다루고있는 것의 더 나은 아이디어를 얻을 수 있습니다. 나는 이것이 (if secondposx, secondposy)에 마크를 설정할 수있는 첫 번째 if 루프 안에 있어야한다고 생각합니다.하지만 제 질문은 어떻게 그 마크를 만들 수 있습니까? 좋은 아이디어있어? 유를 제거하려면 다음JavaFX, 마우스 클릭으로 이미지의 좌표 표시

Circle c = new Circle(secondposx, secondposy, 5, Color.RED); 
anchorPane.getChildren().add(c); 

을 : :-)

private void btnMeasureAction(ActionEvent event) { 
    if (btnMeasure.isSelected()) { 
     imgView.setCursor(Cursor.CROSSHAIR); 
     imgView.setPickOnBounds(true); 
     imgView.setOnMouseClicked(e -> { 
      secondposx = e.getX(); 
      secondposy = e.getY(); 
// I think the MARK should be set here. 
       //System.out.println(secondposx + ", " + secondposy); 


      if ((firstposx == 0)) { 
       firstposx = secondposx; 
       firstposy = secondposy; 
       //System.out.println(firstposx + ", " + firstposy); 
      } else { 
       double distance = Math.sqrt(Math.pow((secondposx - firstposx), 2) + Math.pow((secondposy - firstposy), 2)); 
       System.out.println("The distance is: " + distance); 
       btnMeasure.setSelected(false); 
       imgView.setOnMouseClicked(null); 
       imgView.setCursor(Cursor.DEFAULT); 
       firstposx = 0; 
       firstposy = 0; 
       secondposy = 0; 
       secondposx = 0; 
      } 
+0

은 AnchorPane 내부의 ImageView입니까? – MeGoodGuy

+0

@MeGoodGuy AnchorPane-> BorderPane-> ScrollPane -> ImageView – Heidi

답변

2

하나의 해결책은 래핑하는 것입니다 이미지 뷰를 Pane 안에 넣고 Pane에 적절한 모양을 추가하십시오. 나는. 대신

scrollPane.setContent(imgView); 

Pane imgContainer = new Pane(imgView); 
scrollPane.setContent(imgContainer); 

을하고 당신이 직접 마커를 추가 할 경우

Circle marker = new Circle(secondposx, secondposy, 2, Color.SALMON); 
imgContainer.getChildren().add(marker); 

를 수행 (AnchorPane 기존 또는 조상 인 다른 용기에 이미지보기)를 사용하고 추가 컨테이너를 만드는 것을 피할 수는 있지만 이미지보기에서 해당 컨테이너로 좌표를 변경해야합니다. 먼저 장면의 좌표를 가져온 다음 장면 좌표를 컨테이너 좌표로 변경하면됩니다.

Point2D sceneCoords = new Point2D(e.getSceneX(), e.getSceneY()); 
Point2D anchorPaneCoords = anchorPane.sceneToLocal(sceneCoords); 
Circle marker = new Circle(anchorPaneCoords.getX(), anchorPaneCoords.getY(), 2, Color.CORAL); 
anchorPane.getChildren().add(marker); 
+0

고맙습니다! 후속 질문에 신경 쓰지 않기를 바랍니다. 나중에 마크를 제거 할 수 있습니까? imgContainer.getChildren()을 작성하면 remove (marker); 그것은 단지 후자를 제거합니다. – Heidi

+1

@Heidi 둘 이상의 파일을 제거하려면 두 개 이상의 파일을 추적해야합니다. 예 : private circle firstMarker'와'Private Circle secondMarker' 인스턴스 필드가 필요할 수도 있습니다. 필요한 경우 서클을 생성 할 때 해당 서클을 지정한 다음 필요할 때 둘 다 제거하십시오. (좀 더 일반적으로, 많은 사람이 있다면'List '또는 이와 비슷한 것이 필요할 것입니다.) –

1

이 시도

anchorPane.getChildren().remove(c); 

을 그리고 네는이 곳에서