なんとかピンチを脱出
前に書いたように、ドラッグの操作と表示のやり方はなんとかわかったので、次のステップとしてドロップを試してみた。
ドラッグの際に、選択されているノードを転送用オブジェクトに押し込んでいたので、どれを受け取ってドロップ時の処理をすればいい。
その前に、ドロップを受け入れるかどうかの判定処理がある。
ここで「嫌だ」と言えばドロップ拒否のアイコンが表示される。
試しているうちに、ドラッグとドロップが同じノードであるときは、受け入れ拒否にしたいことに気が付いた。
で、ドロップ先のノードと、転送されてきたノードを比較してと、、、
あれ?拒否にならない。。。。
さんざん調べたら、受け入れの確認の時に送られてきたオブジェクトは、ドラッグ時に転送対象として送ったオブジェクトのコピーだった。
さて、困った。コピーであるということは、オブジェクトの比較では判定できない。
if(node1 == node2){
//同じオブジェクト
}
という処理は常にfalseとなる。
そうかといって、表示されている文字列では判定できない。
これは困った。各ノードに個別のIDを割り振らないとならないか。
面倒だなぁ。
個別のID?
なんか、そんなのあったぞ。
そうだハッシュ値だ!!
javaのオブジェクトではhashCode()というメソッドでハッシュ値を取得できる。
これはデフォルトではアドレス値を返す。
そのためコピーされるとハッシュ値は変わってしまう。
そこで、コンストラクタでハッシュ値を保存しておき、hashCode()メソッドでは保存したハッシュ値を返すようにした。
ついでにequalsメソッドもハッシュ値で比較するようにしておいた。
これで試したところ見事成功。
TraaPathでの比較もできるようになった。
もっとも最初から、コピーじゃなくそのものが送られてくればこんなことする必要はなかったんだが。。。
ともあれ、一応ピンチは脱出した。
ドラッグの際に、選択されているノードを転送用オブジェクトに押し込んでいたので、どれを受け取ってドロップ時の処理をすればいい。
その前に、ドロップを受け入れるかどうかの判定処理がある。
ここで「嫌だ」と言えばドロップ拒否のアイコンが表示される。
試しているうちに、ドラッグとドロップが同じノードであるときは、受け入れ拒否にしたいことに気が付いた。
で、ドロップ先のノードと、転送されてきたノードを比較してと、、、
あれ?拒否にならない。。。。
さんざん調べたら、受け入れの確認の時に送られてきたオブジェクトは、ドラッグ時に転送対象として送ったオブジェクトのコピーだった。
さて、困った。コピーであるということは、オブジェクトの比較では判定できない。
if(node1 == node2){
//同じオブジェクト
}
という処理は常にfalseとなる。
そうかといって、表示されている文字列では判定できない。
これは困った。各ノードに個別のIDを割り振らないとならないか。
面倒だなぁ。
個別のID?
なんか、そんなのあったぞ。
そうだハッシュ値だ!!
javaのオブジェクトではhashCode()というメソッドでハッシュ値を取得できる。
これはデフォルトではアドレス値を返す。
そのためコピーされるとハッシュ値は変わってしまう。
そこで、コンストラクタでハッシュ値を保存しておき、hashCode()メソッドでは保存したハッシュ値を返すようにした。
ついでにequalsメソッドもハッシュ値で比較するようにしておいた。
これで試したところ見事成功。
TraaPathでの比較もできるようになった。
もっとも最初から、コピーじゃなくそのものが送られてくればこんなことする必要はなかったんだが。。。
ともあれ、一応ピンチは脱出した。
JAVA | comments (0) | -
Comments