Flex3.2 TreeのDnD
FlexのTree、DnDによるノードの移動。子ノードが無いノード配下へのドロップができない。
以下、解決策、かな?
TreeコンポーネントのcalculateDropIndexファンクションを利用してカーソルの下にあるノードを取得します。この時、showDropFeedbackによるドロップインジケータはノードの上端。ドロップインジケータが下端に来るのはカーソルがノードの下方に外れたタイミングとなります。
このままインジケータの通りにドロップしてしまうと、ノードの上、もしくは下にしか移動することができません。
ここでひと工夫。インジケータの位置にはドロップさせないのだから、見た目でもわかるようにしたい。そこで、ノードの上から1/4〜ノードの高さの領域にカーソルがある場合にはhideDropFeedbackを利用してドロップインジケータが表示されないようにします。
この領域にカーソルがあることを判定するためにはDragEventのlocalYプロパティを使います。localYプロパティにはtreeコンポーネントの上端からの距離が設定されており、ノードのtreeコンポーネント内におけるY軸の位置を算出することによって、カーソルが領域上にあることがわかります。
領域の開始位置は下記のようにして求めることが出来ます。
ノードHeight*ノードRowIndex+(ノードHeight/4)
領域の終了位置は下記の通り。
ノードHeight*(ノードRowIndex+1)
よってlocalYの値がこの開始位置と終了位置の間にある時を判定すれば良いのだから、下記のようになります。
開始位置 < localY < 終了位置
これらの処理をDragOverハンドラで行います。また、DragDropハンドラでも同様の判定を行い、ドロップ位置を確定します。
実証コードは後日提示予定。
JavaFXのすすめ
ICEfacesのアルファ3が出ていたのでそれを試してみたかったのですが、限りある時間の中でJavaFXへと興味が移ってしまいました。そのためICEfacesを試してみるのは後回しとなり、これからしばらくはJavaFXをいじってみようと思います。JavaFXはバンクーバオリンピックの公式HPでも利用されていたので、それなりに露出度が上がってきたと思っているのですが、やはり業務系のアプリになるとあまり採用されているのを聞きません。(私のまわりだけかもしれないのですが...)
さてJavaFXですがNetBeansで簡単に開発することができます。NetBeansにはJavaFX Composerという機能がついていて、これはキャンバスにボタンやテキストフィールド等をドラッグ&ドロップでポトペタとするだけでアプリを簡単に作れてしまうという優れものです。NetBeans使いの私としては非常に取っ付きやすく、また今までNetBeansを使っていなかった人でも、これからJavaFXをやってみたいと思う人にとっては非常に魅力を感じてくれる部分だと思います。
NetBeansはJavaFXだけでなく、Javaの開発からその他の様々な言語での開発、javaScriptやHTMLエディタとしても秀逸なので、これを機会にEclipseから乗り換えてみたらいかがでしょうか。日本語のコミュニティも充実しています。
NetBeansの話はこのぐらいにしてJavaFXについてですが、勉強するなら下記リンク先が参考になります。
「詳説JavaFX」第3回 変数と型、そしてJavaFX Composer
まだ連載3回目なのでこれから始めるにはもってこいです。あと、Flexでアプリを作っている方など一度見ていただけるとわかりますが、同じようにコーディングできますよ。(もっと簡単かも)
NetBeans6.9 RC2の警告表示
NetBeans6.9 RC2の警告ツールチップ。MacOSX版でも「Alt+Enter キーを押すとヒントが表示されます」となっているんですが、「control+Enter」が正しい。細かいところなんですが数分悩んでしまったので、出来れば改善していただきたいところです。すみません、altキーありました。optionキーの上にaltって書いてあった(前からあったかな)結局「option+Enter」で表示されたのですが「control+Enter」でも表示されるみたいです。
あと、この警告はHashtableとVectorを利用していると表示されるんですが、ライブラリの方が対応してくれないと、どうしても利用せざるおえないインターフェイス(javax.naming.directory.InitialDirContextなど)があるので、警告が表示された状態となってしまいます。ヒントの設定で警告を出さないようにすれば良いのですが、できればSuppressWarningsアノテーションで部分的に警告を消したい。SuppressWarningsアノテーションでこの警告を消せるのか、その場合は引数に何を設定すれば良いのか、もう少し調べてみようと思います。
追記
やっぱりSuppressWarningsアノテーションでは消せないみたいです。deprecation, unchecked, fallthrough, path, serial, finally, allのすべてを指定してみましたが、警告はそのままでした。結局ヒントの設定で警告を外すことにします。
ICEfaces 2.0 Alpha 3
いつのまにかICEfaces 2.0 Alpha 3が出ていたみたい。あとでいろいろ検証してみよう:-)