我有一个 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
克隆方法之前进行验证。
感谢您阅读我的帖子,感谢任何指导。
您可以使用 Stream API 来创建一个对象,如下所示:
Node yourNode = ...;
Node clonedNode = List.of(yourNode).stream().toList().get(0);
它们都是具有不同引用的个体变量。您可以使用
Circle
或其他任何东西来代替 Node
,因此它会自动返回正确的对象类型。