gpt4 book ai didi

Javafx 事件处理程序重叠

转载 作者:行者123 更新时间:2023-12-04 07:13:44 26 4
gpt4 key购买 nike

我有一个 Pane , Pane 内有一个圆圈和一个标签。每次鼠标进入或退出圆圈时,标签都会更改为“进入”或“退出”。并且标签会根据鼠标位置(mouse scenceX 和sceneY)相应地移动。
问题是当我在圆圈内输入鼠标时,标签将更改为“进入”,但会立即更改为“退出”。
我认为我的代码中某处有一个重叠的事件处理程序,但我不知道为什么。这是我的代码:

public class Main extends Application {

@Override
public void start(Stage primaryStage) throws Exception{
Pane pane = new Pane();
pane.setStyle("-fx-background-color: grey;");
pane.setPrefSize(300,300);

Circle circle = new Circle();
circle.setFill(Color.TRANSPARENT);
int radius = 50;
circle.setRadius(radius);
circle.setStroke(Color.BLACK);
circle.setStrokeWidth(2);
circle.setLayoutX(100);
circle.setLayoutY(60);
pane.getChildren().add(circle);

Label label = new Label("Mouse point is outside the circle");
pane.getChildren().add(label);

circle.addEventHandler(MouseEvent.MOUSE_EXITED, e -> {
label.setText("Mouse point is outside the circle");
System.out.println("exit");
});
circle.addEventHandler(MouseEvent.MOUSE_ENTERED, e -> {
label.setText("Mouse point is inside the circle");
System.out.println("enter");
});
pane.addEventFilter(MouseEvent.MOUSE_MOVED, e -> {
label.setLayoutX(e.getSceneX());
label.setLayoutY(e.getSceneY());
});

primaryStage.setTitle("Hello World");
primaryStage.setScene(new Scene(pane));
primaryStage.show();
}


public static void main(String[] args) {
launch(args);
}
}

最佳答案

我只是猜测,但我相信问题在于当事件过滤器为 pane 时执行,结果是鼠标指针从circle里面移动了到里面 label .然后当你移动鼠标时,它离开 label并输入 circle这会导致 MOUSE_ENTERED要触发的事件处理程序。该处理程序触发后,事件过滤器触发,将鼠标指针移出 circle并进入 label这导致 MOUSE_EXITED要触发的事件处理程序。这就是为什么当您在 circle 内部移动鼠标指针时会看到反复进入和退出的原因。 .当您在 pane 周围移动鼠标指针时,您根本看不到进入或退出。当它在 circle 之外时.
为了修复它,我删除了 MOUSE_ENTEREDMOUSE_EXITED在事件过滤器中,我检查鼠标指针是否在 circle 的边界内并设置 label文本相应。
这是代码。
(请注意,我用 addEventFilter 替换了 setOnMouseMoved 。)

import javafx.application.Application;
import javafx.geometry.Bounds;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.stage.Stage;

public class Main extends Application {

@Override
public void start(Stage primaryStage) throws Exception {
Pane pane = new Pane();
pane.setStyle("-fx-background-color: grey;");
pane.setPrefSize(300, 300);

Label label = new Label("Mouse point is outside the circle");

Circle circle = new Circle();
circle.setFill(Color.TRANSPARENT);
int radius = 50;
circle.setRadius(radius);
circle.setStroke(Color.BLACK);
circle.setStrokeWidth(2);
circle.setLayoutX(100);
circle.setLayoutY(60);
Bounds boundingBox = circle.getBoundsInParent();
double maxX = boundingBox.getMaxX();
double minX = boundingBox.getMinX();
double maxY = boundingBox.getMaxY();
double minY = boundingBox.getMinY();

pane.getChildren().add(circle);
pane.getChildren().add(label);
pane.setOnMouseMoved(e -> {
double x = e.getSceneX();
double y = e.getSceneY();
if (minX < x && x < maxX && minY < y && y < maxY) {
label.setText("Mouse point is inside the circle");
}
else {
label.setText("Mouse point is outside the circle");
}
label.setLayoutX(e.getSceneX());
label.setLayoutY(e.getSceneY());
});
primaryStage.setTitle("Hello World");
Scene scene = new Scene(pane);
primaryStage.setScene(scene);
primaryStage.show();
}

public static void main(String[] args) {
launch(args);
}
}

关于Javafx 事件处理程序重叠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68900757/

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