JavaFX,用鼠标点击标记图像上的坐标
JavaFX, mark coordinates on an image with mouse click
我正在尝试在 JavaFX 中制作一个用于 ImageView 的测量工具,我在其中单击图像中的两个点,然后获取它们之间的距离 - 我已经弄清楚了这一部分。但是,我也希望能够 see/mark 在我点击的图片上的位置,但我无法想象如何才能做到最好。我将附上测量工具的代码,以便您更好地了解我正在处理的内容。我认为它必须在第一个 if 循环内,我可以在其中将标记设置为 (secondposx, secondposy) - 但我的问题是,如何制作该标记?你有什么好主意吗? :-)
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;
}
试试这个:
Circle c = new Circle(secondposx, secondposy, 5, Color.RED);
anchorPane.getChildren().add(c);
然后如果你想删除它:
anchorPane.getChildren().remove(c);
是的,就在这个地方
一种解决方案是将图像视图包裹在 Pane
中,然后向 Pane
添加适当的形状。 IE。而不是
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);
我正在尝试在 JavaFX 中制作一个用于 ImageView 的测量工具,我在其中单击图像中的两个点,然后获取它们之间的距离 - 我已经弄清楚了这一部分。但是,我也希望能够 see/mark 在我点击的图片上的位置,但我无法想象如何才能做到最好。我将附上测量工具的代码,以便您更好地了解我正在处理的内容。我认为它必须在第一个 if 循环内,我可以在其中将标记设置为 (secondposx, secondposy) - 但我的问题是,如何制作该标记?你有什么好主意吗? :-)
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;
}
试试这个:
Circle c = new Circle(secondposx, secondposy, 5, Color.RED);
anchorPane.getChildren().add(c);
然后如果你想删除它:
anchorPane.getChildren().remove(c);
是的,就在这个地方
一种解决方案是将图像视图包裹在 Pane
中,然后向 Pane
添加适当的形状。 IE。而不是
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);