2017-05-04 4 views
0

J'essaye de faire un outil de mesure dans JavaFX à utiliser sur un ImageView, où je clique sur deux points dans l'image et ensuite obtiens la distance entre eux - j'ai compris partie dehors. Cependant, je veux aussi pouvoir voir/marquer où sur l'image j'ai cliqué, mais je ne peux pas imaginer comment serait le meilleur pour le faire. Je vais attacher le code pour l'outil de mesure, afin que vous ayez une meilleure idée de ce que j'ai à faire. Je pense qu'il doit être dans la première boucle if, où je peux définir la marque à (secondposx, secondposy) - mais ma question est, comment puis-je faire cette marque? Avez-vous de bonnes idées? :-)JavaFX, marquez les coordonnées sur une image avec le clic de la souris

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

est votre ImageView dans un AnchorPane? – MeGoodGuy

+0

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

Répondre

2

Une solution consiste à envelopper votre vue d'image à l'intérieur d'un Pane, et ajouter des formes appropriées à la Pane. C'est à dire. au lieu de

scrollPane.setContent(imgView); 

faire

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

puis faire

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

Si vous souhaitez ajouter les marqueurs directement à l'existant AnchorPane (ou à tout autre récipient qui est un ancêtre de la vue d'image), et évitez de créer un conteneur supplémentaire, vous pouvez le faire mais vous devrez changer les coordonnées de la vue de l'image à ce conteneur. Vous pouvez le faire d'abord obtenir les coordonnées de la scène, puis changer de coordonnées scène au conteneur coordonnées:

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

Merci monsieur! J'espère que cela ne vous dérange pas une question de suivi. Comment puis-je supprimer les marques après? Si j'écris imgContainer.getChildren(). Remove (marqueur); il enlève seulement le dernier. – Heidi

+1

@Heidi Si vous voulez en supprimer plus d'un, vous devrez en garder plusieurs; par exemple. vous pourriez avoir besoin de deux champs d'instance 'private circle firstMarker' et' private Circle secondMarker'. Affectez les cercles à ceux-ci, le cas échéant, lorsque vous les créez, puis supprimez-les lorsque vous en avez besoin. (Plus généralement, si vous en aviez beaucoup, vous pourriez avoir besoin d'une «Liste » ou similaire.) –

1

Essayez ceci:

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

Ensuite, si tu veux supprimer:

anchorPane.getChildren().remove(c); 

Et oui son à cet endroit