首页 > 解决方案 > 跟踪节点 Obervable Nodes JavaFX

问题描述

在舞台上,我有两个窗格,当我单击一个窗格时,会创建一个新节点并将其添加到 ObservableList 中。我想在一个窗格节点上创建相同的,反之亦然。我在列表集的列表列表中,当它检测到列表中的更改时,它应该将此节点添加到所有窗格中。

当我单击第二个面板时,它们会加起来但仅在第一个面板上,它们不会出现在第二个面板上。我也有节点移位的问题,我希望能够仅在其窗格内移动节点,因此它不能超出其窗格。

我不知道该怎么做,我现在所做的对我不起作用

public class MainTest extends Application {
    private ObservableList<Circle> observableList= FXCollections.observableArrayList();
    private Pane pane;
    private Pane pane2;
    private HBox root;
    private double orgSceneX, orgSceneY;
    private double orgTranslateX, orgTranslateY;

    @Override
    public void start(Stage stage) throws Exception {
        root = new HBox();
        root.setPadding(new Insets(3));
        root.setBorder(new Border(new BorderStroke(Color.BLACK,
                BorderStrokeStyle.SOLID, new CornerRadii(1), new BorderWidths(2))));
        root.setBackground(new Background(new BackgroundFill(
                Color.DARKSLATEGRAY, CornerRadii.EMPTY, Insets.EMPTY)));

        pane=createPane();
        root.getChildren().add(pane);
        setClick(pane);

        pane2 = createPane();
        root.getChildren().add(pane2);
        setClick(pane2);

        Scene scene = new Scene(root);
        stage.setScene(scene);
        stage.show();

        observableList.addListener((ListChangeListener<Node>) change -> {
            while(change.next()){
                if(change.wasAdded()){
                    // pane2.getChildren().clear();
                    //pane.getChildren().clear();

                    pane2.getChildren().addAll(observableList);
                    System.out.println(pane2.getChildren().size());
                    pane.getChildren().addAll(observableList);
                    System.out.println(pane.getChildren().size());
                }
            }
        });
    }

    private Pane createPane() {
        Pane pane = new Pane();
        pane.setPrefWidth(500);
        pane.setPrefHeight(350);
        pane.setBorder(new Border(new BorderStroke(Color.DARKGRAY,
                BorderStrokeStyle.SOLID, CornerRadii.EMPTY, new BorderWidths(1))));
        return pane;
    }

    void setClick(Pane pane) {
        pane.setOnMouseClicked(e -> {
            double drawX = e.getX();
            double drawY = e.getY();

            if(e.getButton() == MouseButton.PRIMARY) {
                Circle circle = makeCircle(drawX, drawY);
                observableList.add(circle);
           //     pane.getChildren().add(circle);
                circle.setOnMouseClicked(event -> {
                    if(event.getButton() == MouseButton.SECONDARY) {
                        observableList.remove(circle);
                        deleteCircle(circle, pane);
                        event.consume();
                    }
                });
            }
        });
    }

    private Circle makeCircle(double drawX, double drawY) {
        Circle circle = new Circle(drawX, drawY, 5, Color.RED);
        circle.setStroke(Color.BLACK);

        EventHandler<MouseEvent> mouseHandler3 = k -> {
            circle.setCursor(Cursor.OPEN_HAND);
            k.consume();
        };

        circle.setOnMousePressed(circleOnMousePressedEventHandler);
        circle.setOnMouseDragged(circleOnMouseDraggedEventHandler);
        circle.setCursor(Cursor.OPEN_HAND);
        System.out.println(circle.getCenterX() + " " + circle.getCenterY());
        return circle;
    }


    EventHandler<MouseEvent> circleOnMousePressedEventHandler =
            new EventHandler<>() {

                @Override
                public void handle(MouseEvent t) {
                    orgSceneX = t.getSceneX();
                    orgSceneY = t.getSceneY();
                    orgTranslateX = ((Circle) (t.getSource())).getTranslateX();
                    orgTranslateY = ((Circle) (t.getSource())).getTranslateY();
                }
            };

    EventHandler<MouseEvent> circleOnMouseDraggedEventHandler =
            new EventHandler<>() {

                @Override
                public void handle(MouseEvent t) {
                    double offsetX = t.getSceneX() - orgSceneX;
                    double offsetY = t.getSceneY() - orgSceneY;
                    double newTranslateX = orgTranslateX + offsetX;
                    double newTranslateY = orgTranslateY + offsetY;

                    ((Circle) (t.getSource())).setTranslateX(newTranslateX);
                    ((Circle) (t.getSource())).setTranslateY(newTranslateY);
                }
            };

    private void deleteCircle(Circle circle, Pane pane) {
        pane.getChildren().remove(circle);
    }
}

标签: javajavafx

解决方案


推荐阅读