Javafx:通过拖动节点来复制节点,并通过将其放置到Pane中的某个位置来粘贴副本



是否可以深度复制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方法中是有意义的。

最新更新