使用 javafx 和 mvvmfx 不触发事件

Event does not trigger using javafx and mvvmfx

我正在尝试使用 javafx 和 mvvmfx 框架构建应用程序来计算和显示 CVRP Problem 但是当我在 Circle 上添加事件侦听器时,它永远不会被触发。

scope.subscribe("STOP_LOADED", (key, payload) -> {
        stepList.clear();
        stopList.clear();
        Stop depot = CVRPGraph.getDepot();
        stopList.add(new Circle(toUiUnit(depot.getX()), toUiUnit(depot.getY()), 3, Color.BLACK));
        stopList.addAll(CVRPGraph.getClientList().stream()
                .map(stop -> {
                    Circle circle = new Circle(toUiUnit(stop.getX()), toUiUnit(stop.getY()), 3, Color.RED);
                    circle.setOnMouseClicked(mouseEvent -> System.out.println(mouseEvent.getEventType().getName()));
                    return circle;
                })
                .collect(Collectors.toList()));
    });

stopList 是这样初始化的

private final ObservableList<Circle> stopList = FXCollections.observableArrayList();

我在视图模型中填充了它,在视图中我观察到这样的变化

graphViewModel.stopList().addListener((ListChangeListener<? super Circle>) change -> {
            stopGroup.getChildren().clear();
            stopGroup.getChildren().addAll(change.getList());
        });

其中 stopGroup 是 javafx.scene.Group

@FXML
private Group stopGroup;

显示了圆圈,但是当我点击它时什么也没有打印出来

Program screenshot 我做错了什么?

P.S。您可以在此处找到完整代码 https://github.com/ptourneur/CapacitatedVehicleRoutingProblem,但如果您需要更多信息,请不要犹豫,谢谢

您的示例应用中的问题是布局配置错误。您对 AnchorPane 的使用是错误的。您的 "ParamView.fxml" 覆盖了整个应用程序 window,即使它仅在右侧可见。因此它也消耗了所有鼠标事件。如果您删除 paramsview,则点击处理程序会按预期工作。对于调试,您可以向容器组件添加视觉边框,以查看它们实际使用了多少 space。 如果您使用 AnchorPane,您通常还应该使用 AnchorPane.bottomAnchor、topAnchor 等。