2017-10-11 9 views
0

Label(または他のノード)をディープコピーすることができるので、同じプロパティ値を持つ新しいLabelオブジェクトが作成されますDragboardに入れますか?Javafx:ノードをドラッグしてペイン内の場所にドロップしてコピーする

私はこの機能を実装したいと考えています:ラベルをドラッグし、ある場所にドロップします(Pane)。同じプロパティ値を持つ新しいLabelオブジェクトが、ドロップの場所のペインに作成されます。

答えて

1

私が知る限り、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メソッドにカプセル化すると意味があります。

関連する問題