JavaFX 中的节点克隆

问题描述 投票:0回答:1

我有一个 JavaFX

Node
对象,我希望通过代码克隆它。

据我所知,Java 变量是引用类型,简单地执行类似

clonedNode = oldNode
之类的操作会导致
clonedNode
指向
oldNode

JavaFX 似乎没有用于克隆

Node
对象的内置函数。因此,我尝试自己编写一个克隆函数(假设我只使用
Node
Circle
Rectangle
Polygon
Line
Text
类型的
Group
,我只关心
Fill
Stroke
Text
Node
的位置属性):

public static Node NodeClone(Node oldNode)
{
    Node clonedNode = null;

    if (oldNode.getClass() == Circle.class)
    {
        Circle oldCircle = (Circle)oldNode;

        Circle clonedCircle = new Circle();
        clonedCircle.setRadius(oldCircle.getRadius());
        clonedCircle.setFill(oldCircle.getFill());
        clonedCircle.setStroke(oldCircle.getStroke());
        clonedCircle.setStrokeWidth(oldCircle.getStrokeWidth());

        clonedNode = clonedCircle;
    }
    else if (oldNode.getClass() == Rectangle.class)
    {
        Rectangle oldRectangle = (Rectangle)oldNode;

        Rectangle clonedRectangle = new Rectangle();
        clonedRectangle.setWidth(oldRectangle.getWidth());
        clonedRectangle.setHeight(oldRectangle.getHeight());
        clonedRectangle.setFill(oldRectangle.getFill());
        clonedRectangle.setStroke(oldRectangle.getStroke());
        clonedRectangle.setStrokeWidth(oldRectangle.getStrokeWidth());

        clonedNode = clonedRectangle;
    }
    else if (oldNode.getClass() == Polygon.class)
    {
        Polygon oldTriangle = (Polygon)oldNode;

        Polygon clonedTriangle = new Polygon();
        LinkedList<Double> clonedPoints = new LinkedList<Double>(oldTriangle.getPoints());
        clonedTriangle.getPoints().setAll(clonedPoints);
        clonedTriangle.setFill(oldTriangle.getFill());
        clonedTriangle.setStroke(oldTriangle.getStroke());
        clonedTriangle.setStrokeWidth(oldTriangle.getStrokeWidth());

        clonedNode = clonedTriangle;
    }
    else if (oldNode.getClass() == Line.class)
    {
        Line oldLine = (Line)oldNode;

        Line clonedLine = new Line();
        clonedLine.setStartX(oldLine.getStartX());
        clonedLine.setStartY(oldLine.getStartY());
        clonedLine.setEndX(oldLine.getEndX());
        clonedLine.setEndY(oldLine.getEndY());
        clonedLine.setStroke(oldLine.getStroke());
        clonedLine.setStrokeWidth(oldLine.getStrokeWidth());

        clonedNode = clonedLine;
    }
    else if (oldNode.getClass() == Text.class)
    {
        Text oldText = (Text)oldNode;

        Text clonedText = new Text();
        clonedText.setFont(oldText.getFont());
        clonedText.setText(oldText.getText());
        clonedText.setFill(oldText.getFill());

        clonedNode = clonedText;
    }
    else if (oldNode.getClass() == Group.class)
    {
        Group oldGroup = (Group)oldNode;

        Group clonedGroup = new Group();

        for (int i = 0; i < oldGroup.getChildren().size(); i++)
            clonedGroup.getChildren().add(NodeClone(oldGroup.getChildren().get(i)));

        clonedNode = clonedGroup;
    }
    else
    {
        throw new java.lang.Error("ERROR: Attempting to clone an unrecognized JavaFX oldNode type!");
    }

    clonedNode.setTranslateX(oldNode.getTranslateX());
    clonedNode.setTranslateY(oldNode.getTranslateY());
    clonedNode.setLayoutX(oldNode.getLayoutX());
    clonedNode.setLayoutY(oldNode.getLayoutY());
    clonedNode.setRotate(oldNode.getRotate());

    return clonedNode;
}

上面的函数返回所提供的

Node
对象的克隆实例。

我的问题是,直接在属性 getter 的结果上调用各种

Node
的属性 setter 会导致属性值按值传递还是按引用传递?

换句话说,上面的函数返回的克隆

Node
的属性是真正唯一的还是仍然指向原始
Node
的属性?

根据我自己的测试,这个函数似乎确实产生了完全独特的

Node
,但我想在完全采用这种
Node
克隆方法之前进行验证。

感谢您阅读我的帖子,感谢任何指导。

java javafx cloning
1个回答
0
投票

您可以使用 Stream API 来创建一个对象,如下所示:

Node yourNode = ...;

Node clonedNode = List.of(yourNode).stream().toList().get(0);

它们都是具有不同引用的个体变量。您可以使用

Circle
或其他任何东西来代替
Node
,因此它会自动返回正确的对象类型。

© www.soinside.com 2019 - 2024. All rights reserved.