isPopupTrigger での失敗2008年10月14日 09時26分48秒

MouseEvent の isPopupTrigger を使って、JPopupMenu を出すのに tryPopup(Event e) と名付けた関数を呼び出していた。

PhotoView 用に作っていたこの関数は、JTree などから、選択されたノードを得て、それに対して何らかの動作をするようにしてあった。上の変更をすると、UNIX 上でどうしてもうまくいかない。選択されているノードが思ったように取れていなかった。

結果としては、tryPopup の中で、一度クラス変数の nodes に null を割り当てているのが失敗だった。なお、以下の getSelectedNodes() は自前の関数で、Java API には無い。


... tryPopup(MouseEvent evt)
{
   nodes = null;
   if(!evt.isPopupTrigger())
      return;
   nodes = getSelectedNodes();
   ...
}

Popup を行なわない時に誤動作が無いようにと随分と前に入れたと思う。それが、今回この関数が MousePressed と MouseReleased に呼ばれることになり、UNIX 上では MouseReleased が nodes をクリアしてしまう結果になった。

イベントの処理の順番を追ったところ MousedPressed -> MouseReleased -> MouseClicked -> ... -> @Action の順だった。そのため、@Action が呼ばれるときには既に nodes が null になっていた。

今回は NetBeans のデバッガを使って追ってみたが、JPopupMenu のデバッグは結構難しい。Popup をする時に break ポイントを設定すると、右クリックした時に処理が中断する。デバッガで処理を追って再開すると、フォーカスが既に NetBeans に移っているので、Popup メニューが消えて選べない。それ以降の処理がデバッガで追えないので少々手間取った。

コメント

コメントをどうぞ

※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。

※なお、送られたコメントはブログの管理者が確認するまで公開されません。

名前:
メールアドレス:
URL:
コメント:

トラックバック

このエントリのトラックバックURL: http://uyota.asablo.jp/blog/2008/10/14/3818721/tb

※なお、送られたトラックバックはブログの管理者が確認するまで公開されません。