使用 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 等。
我正在尝试使用 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 等。