【问题标题】:JavaFX how to remove specific node by mouseSecondary buttonJavaFX如何通过鼠标辅助按钮删除特定节点
【发布时间】:2017-09-22 02:39:30
【问题描述】:

我被书中的一个练习弄糊涂了。它要求我每次单击鼠标左键时在鼠标箭头的位置上创建一个圆圈,然后如果我的鼠标正好在这个圆圈中并单击右键,则删除该节点。在窗格中添加圆圈很容易,所以我可以快速完成它但很难删除它,所以我被困在这部分,有人可以添加一些代码来删除圆圈吗?

package com.company;

import javafx.application.Application;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.input.MouseButton;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.stage.Stage;

import java.util.ArrayList;

public class AddOrDeletePoint extends Application {
    @Override
    public void start(Stage primaryStage) {
        Pane pane = new Pane();
        double radius = 5;
        pane.setOnMouseClicked(e -> {
            double X = e.getSceneX();
            double Y = e.getSceneY();
            Circle circle = new Circle(X, Y, radius);
            circle.setFill(Color.WHITE);
            circle.setStroke(Color.BLACK);
            if (e.getButton() == MouseButton.PRIMARY) {
                pane.getChildren().add(circle);
            } else if (e.getButton() == MouseButton.SECONDARY) {
                pane.getChildren().remove(circle);//this is the remove part, but it does not work!
            }
        });

        Scene scene = new Scene(pane);
        primaryStage.setScene(scene);
        primaryStage.show();
    }
}

所以就像这样,如果我的鼠标停留在那个圆圈上然后单击右键,如何从窗格中删除圆圈?

【问题讨论】:

  • “有人可以添加一些代码吗”不是真的,伙计。
  • 对不起,我的表述可能有点模糊,我的形象比较清晰。
  • 想想你需要什么来解决这个问题。首先,您不能删除刚刚创建的圈子。您必须删除之前添加的那个。所以你必须把它们放在某种集合中。然后,当用户右键单击时,您必须遍历它们并根据鼠标单击的 x、y 位置找到要删除的圆圈。完成每个步骤。

标签: java javafx


【解决方案1】:

你总是创建一个圈子。如果单击辅助按钮,则该圆圈从未添加到场景中,并且不会从pane 的子列表中删除任何内容。您需要删除现有圈子。

为您创建的圈子注册“删除圈子”侦听器:

pane.setOnMouseClicked(e -> {
    if (e.getButton() == MouseButton.PRIMARY) {
        double X = e.getX(); // remove pane's coordinate system here
        double Y = e.getY(); // remove pane's coordinate system here
        final Circle circle = new Circle(X, Y, radius);
        circle.setFill(Color.WHITE);
        circle.setStroke(Color.BLACK);

        circle.setOnMouseClicked(evt -> {
            if (evt.getButton() == MouseButton.SECONDARY) {
                evt.consume();
                pane.getChildren().remove(circle);
            }
        });

        pane.getChildren().add(circle);
    }
});

您也可以使用选择结果:

pane.setOnMouseClicked(e -> {
    if (e.getButton() == MouseButton.PRIMARY) {
        double X = e.getX(); // remove pane's coordinate system here
        double Y = e.getY(); // remove pane's coordinate system here
        Circle circle = new Circle(X, Y, radius);
        circle.setFill(Color.WHITE);
        circle.setStroke(Color.BLACK);

        pane.getChildren().add(circle);
    } else if (e.getButton() == MouseButton.SECONDARY) {
        // check if cicle was clicked and remove it if this is the case
        Node picked = e.getPickResult().getIntersectedNode();
        if (picked instanceof Circle) {
            pane.getChildren().remove(picked);
        }
    }
});

【讨论】:

  • 有效!顺便问一下evt.consume();的作用是什么?
  • @PanPan 它阻止事件传递到更接近场景根的节点。在这种情况下,这并不是真正必要的,但如果您想使用窗格本身的辅助来处理点击,它可能会有所帮助...
猜你喜欢
  • 2020-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多