繁体   English   中英

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

[英]Javafx: copy node by dragging it and paste the copy by dropping it to a location in Pane

是否可以深度复制Label (或任何其他节点),以便创建具有相同属性值的新Label对象,然后将其放入Dragboard

我要实现此功能:将标签拖放到Pane中的某个位置。 在放置位置的“窗格”中创建一个具有相同属性值的新Label对象。

据我所知, Label没有实现Java Cloneable接口,因此也没有内置的方式来进行深度复制, Node也没有。

您可以创建自己的类,该类扩展Label并实现Cloneable并且在该类中重写clone方法,并且对希望深层复制的每个其他Node都这样做,这是最可靠的解决方案,但它可能比您要做的更多需要。

另一个选择是只创建一个具有相同属性的新Label,就像这样简单

Label newLabel = new Label(oldLabel.getText(), oldLabel.getGraphic());

请注意,该方法可能有问题,因为它不是真正的深拷贝,因此newLabel和oldLabel现在引用相同的Graphic Node,这又一次可能会导致您两次将同一Graphic Node添加到场景中。 更好的副本可能会像

ImageView oldGraphic = (ImageView) oldLabel.getGraphic();
Label newLabel = new Label(oldLabel.getText(), new ImageView(oldGraphic.getImage());

这仍然不是真正的深层副本,但是没有规则可以将相同的Image添加到场景中的次数不限,因此您在这里很安全。 这种方法对于Labels来说很好,它只有两行(它可以折叠成偶数,但我为了提高可读性而去了),但是对于更复杂的节点类型,可能真的很麻烦。 如果只是标签,这是一个好的解决方案,但否则将所有需要的复制封装到新的clone方法中将是有意义的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM