Label
(または他のノード)をディープコピーすることができるので、同じプロパティ値を持つ新しいLabel
オブジェクトが作成されますDragboard
に入れますか?Javafx:ノードをドラッグしてペイン内の場所にドロップしてコピーする
私はこの機能を実装したいと考えています:ラベルをドラッグし、ある場所にドロップします(Pane
)。同じプロパティ値を持つ新しいLabel
オブジェクトが、ドロップの場所のペインに作成されます。
Label
(または他のノード)をディープコピーすることができるので、同じプロパティ値を持つ新しいLabel
オブジェクトが作成されますDragboard
に入れますか?Javafx:ノードをドラッグしてペイン内の場所にドロップしてコピーする
私はこの機能を実装したいと考えています:ラベルをドラッグし、ある場所にドロップします(Pane
)。同じプロパティ値を持つ新しいLabel
オブジェクトが、ドロップの場所のペインに作成されます。
私が知る限り、Label
はJava Cloneable
インターフェイスを実装していないため、ディープコピー自体に組み込まれていません。Node
もありません。あなたはLabel
を拡張し、Cloneable
を実装し、そのクラスにclone
メソッドをオーバーライドして、あなたにも深いコピーしたいNode
他のすべてのためにそれを行う独自のクラスを作成することができ
が、これは最も堅牢なソリューションですが、それはかもしれませんあなたが必要とする以上のものになります。
他のオプションは、ちょうどそれがないよう、あなたが、その方法に問題があるかもしれ
Label newLabel = new Label(oldLabel.getText(), oldLabel.getGraphic());
ノートのようなもののような単純なものでした同じプロパティを持つ新しいラベルを作成することですtrueディープコピーでは、newLabelとoldLabelは同じグラフィックノードを参照します。同じグラフィックノードをシーンに2度追加すると問題が発生することがあります。よりよいコピーはこれはまだ本当の深いコピーではないですが、あなたが望むように何度でもシーンに同じImage
を追加することに対する規則がないので、あなたが安全だ
ImageView oldGraphic = (ImageView) oldLabel.getGraphic();
Label newLabel = new Label(oldLabel.getText(), new ImageView(oldGraphic.getImage());
ような何かを行う可能性があります。このようなアプローチは、ラベルには問題ありませんが、2行しかない(1つに縮小することもできますが、読みやすくするために行っています)が、より複雑なタイプのノードにとっては本当に扱いにくくなる可能性があります。単なるラベルの場合は、ここで問題はありませんが、それ以外の場合は、必要なすべてのコピーを新しいclone
メソッドにカプセル化すると意味があります。