是否可以深度复制Label
(或任何其他节点),以便它创建一个具有相同属性值的新Label
对象,然后将其放入Dragboard
?
我想实现这个功能:拖动标签并将其放置在Pane
中的某个位置。在放置位置的Pane中创建一个具有相同属性值的新Label
对象。
据我所知,Label
没有实现JavaCloneable
接口,因此没有任何内置的方式来深度复制自己,Node
也没有。
您可以创建自己的类来扩展Label
并实现Cloneable
,并且在该类中重写clone
方法,并对您希望深度复制的每一个其他Node
都这样做,这是最健壮的解决方案,但它可能超出了您的需要。
另一种选择是创建一个具有相同属性的新标签,它可以像一样简单
Label newLabel = new Label(oldLabel.getText(), oldLabel.getGraphic());
请注意,该方法可能有问题,因为它不是true深度复制,newLabel和oldLabel现在引用同一个图形节点,再次将同一图形节点添加到场景中两次可能会有问题。一个更好的副本可能会做一些类似的事情
ImageView oldGraphic = (ImageView) oldLabel.getGraphic();
Label newLabel = new Label(oldLabel.getText(), new ImageView(oldGraphic.getImage());
这仍然不是一个真正的深度复制,但没有规则禁止在场景中多次添加相同的Image
,因此您在那里是安全的。这种方法对Labels来说很好,它只有两行(甚至可以折叠成一行,但我追求更高的可读性),但对于更复杂类型的节点来说,可能会变得非常麻烦。如果只是标签,这里有一个不错的解决方案,但除此之外,将所有需要的复制封装到一个新的clone
方法中是有意义的。