gpt4 book ai didi

javafx - MouseEvent -- 添加圆圈到场景

转载 作者:行者123 更新时间:2023-12-02 03:27:10 27 4
gpt4 key购买 nike

程序涉及到EventHandlers和MouseEvents的应用。该程序的目标是呈现一个空白场景,用户可以左键单击(主要)并向事件发生时鼠标所在的场景添加一个圆形对象。可以添加的圈数无关紧要。当用户在将鼠标悬停在目标节点(圆形对象)上时右键单击(辅助)鼠标时,该对象将从场景中移除。到目前为止我编写的程序将显示一个圆圈,但只在场景的原点而不是鼠标所在的位置。此外,我只能向场景中添加一个圆圈而不能添加其他圆圈,如果我再次单击主要圆圈,我将无法单击次要圆圈并删除位于原点的圆圈。

   static Circle circle;    

@Override
public void start(Stage primaryStage) {
StackPane root = new StackPane();
Scene scene = new Scene(root, 350, 300);
primaryStage.setTitle("Dots");
primaryStage.setScene(scene);

root.addEventHandler(MouseEvent.MOUSE_CLICKED, (MouseEvent me) -> {
if(me.getButton().equals(MouseButton.PRIMARY)) {
root.getChildren().add(new Circle(me.getScreenX(), me.getScreenY(), 10, Color.BLUE));
}
});

root.addEventHandler(MouseEvent.MOUSE_ENTERED_TARGET, (MouseEvent me) -> {
if(me.getButton().equals(MouseButton.SECONDARY)) {
root.getChildren().remove(me.getTarget());
}
});

primaryStage.show();
}

我不认为使用两个事件处理程序是完成此任务的最佳方法。最初,我在第一个处理程序的 if else 语句中有第二个事件处理程序主体 (root.getChildren)。我更改它的原因是因为我不确定如何实现 MouseEvent.MOUSE_ENTERED_TARGET 来指定要从场景中删除哪个圆形对象。

最佳答案

我建议您使用 Group取而代之的是 StackPane因为它不会自动安排子节点。

要了解有关布局行为的更多信息,我建议您阅读 this answer

对于创建的每个圈子,添加一个 EventHandler对其进行监控Right-Clicks在它们上面然后将它们从中删除Parent

import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.input.MouseButton;
import javafx.scene.input.MouseEvent;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.stage.Stage;

public class AddAndRemoveCircles extends Application {

@Override
public void start(Stage primaryStage) {
Group root = new Group();
Scene scene = new Scene(root, 350, 300);
primaryStage.setTitle("Dots");
primaryStage.setScene(scene);

scene.addEventHandler(MouseEvent.MOUSE_CLICKED, (MouseEvent me) -> {
if(me.getButton().equals(MouseButton.PRIMARY)) {
Circle circle = new Circle(me.getX(), me.getY(), 10, Color.BLUE);
addEventHandler(root, circle);
root.getChildren().add(circle);
}
});

primaryStage.show();
}

public void addEventHandler(Group parent, Node node) {
node.addEventHandler(MouseEvent.MOUSE_CLICKED, (MouseEvent me) -> {
if(me.getButton().equals(MouseButton.SECONDARY)) {
parent.getChildren().remove(node);
}
});
}
}

关于javafx - MouseEvent -- 添加圆圈到场景,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29739203/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com