マウスイベントが下層のNodeに拾われて困ります

Node.blocksMouse

いくつかのNodeが重なっているとき、例えばNodeのシーケンスが[a,b,c]のように(aが最下層)なっているとき、 各Nodeがそれぞれマウスイベントを見張っているとしましょう。 実例で言うとポップアップしたダイアログ上に配置されたボタンを想像してください。 ここで c に拾わせたいマウスイベントを a や b が拾ってしまう現象の解決を書きます。

Node.blockMouseをtrueにするとマウスイベントが下層の a や b にまで伝わってしまうことを防御できます。 デフォルトではfalseなので、基本すり抜けてしまいます。

例:

def c = MyNode{
  ...
  blockMouse:true
  ...
}

Button.actionに書かずにonMouseClickedに書く

javafx.scene.control.Button の話です。 前述の解決策をしても、Button.actionはブロックされず下層に伝わります。 actionはマウスイベントではないのでブロックしないという理屈なのでしょうか。 一方、リッスンしている側はマウスイベントとして検知します。 なんとなく不思議な理屈ですが動きとしてはそうです。 解決策としては、actionに書かずにonMouseClickedに書いてください。 例えば、ダイアログを最前面に出すような場面では、 ダイアログの最下層に敷いたRectangleのblockMouseをtrueにし、 ダイアログに配置するButtonのactionに処理内容を書かずonMouseClickedに書きます。

WidgetFXでの注意

WidgetFXを使ってウィジェットを作る場合には注意が必要です。 onBlockMouseをtrueにするとウィジェットをドラッグできなくなります。 とは言え、ウィジェット内でのドラッグ&ドロップが前提になる場合も あるでしょう。ブロックする面積を極小化する工夫が必要です。


カウンター

Home