0

その中に aStackPaneと aGroupがあります。グループには実際のビジュアル コンテンツがあり、ユーザーはパンやズームを行うことができます。グループには座標変換があります。

グループの外で発生した場合でも、マウスとスクロールのイベントが同じように動作することを望みます (ズームアウトされているか、グループのグラフィックに穴が開いているため)。

座標系が異なるため、StackPane からイベントを直接転送 (マウス) することはできません。

グループの後ろに大きな透明な Rectangle を配置しようとしましたが、グラフィック システムのテクスチャ サイズがオーバーフローします (= ダメです)。

現在、StackPane と Group の両方にハンドラーを配置し、Group 内の座標修正された別のメソッドに渡すことを考えています。動作しますが、私が気付いていないより優れたメカニズムが存在するでしょうか?

4

2 に答える 2

0

私がこれを解決した方法:

コンストラクターで、Groupその親のハンドラーをセットアップします。

runLater {   
  val pv= parent.value
  assert( pv != null )

  ..some local var's here..

  pv.onMousePressed = (ev: MouseEvent) => if (ev.primaryButtonDown) {
  ...

runLater、Group をその親にアタッチする (または潜在的な親のハンドルをコンストラクター パラメーターとして指定する) 必要がないことに注意します。runLater-block が実行されると、親子関係が確立されます。

これはかなりきちんとしたアプローチだと思います。これにより、すべてのイベント処理をグループ内で行うことができますが、それでも親のより大きな領域を使用します。コードを 2 か所に配置する必要はありません。(グループのイベントではなく) 呼び出されるのは親のイベントであるため、座標変換は常に同じです。

私は Scala を使用していますが、同じアプローチがどの JVM 言語でも機能するはずです。

注: ハンドラーを で始めるとif、現在の ScalaFX ではコンパイルされません。これは ScalaFX の小さな不具合であり、簡単に修正できます (詳しくはお問い合わせください)。

于 2013-01-08T13:30:31.943 に答える