6

2 つの兄弟ペイン間のイベント伝播に関する問題を解決する正しい方法はありますか?

たとえば、内部に 2 つのペインを持つ StackPane があります。

StackPane p = new StackPane();
Region p1 = new Region();
Region p2 = new Region();
p.getChildren().addAll(p1, p2);

この例の p2 はマウス イベントをキャプチャし、イベントが消費されなくても p1 はそれに反応できません。

イベントがp2によって消費されない場合、イベントをp1に伝播する正しい方法はありますか?

両方の子要素がマウスに反応する必要があるため、setMouseTransparent は私の問題を解決しません。

アドバイスありがとう。

4

4 に答える 4

3

デフォルトでは、イベントは階層を伝播し、ルートで終了します。問題を解決するためのアプローチがいくつかあります。

  1. 独自のイベント インスタンスを作成します。共有イベント インスタンスをトリガーするイベント ハンドラーを両方のリージョンに追加します。リージョン間で共通にするイベント処理コードを共有インスタンスに追加します。これは、あなたが与えた説明から私がとるアプローチです。
  2. ルートですべてのイベントをキャッチし、ただ死ぬのではなく、誰もが登録できるグローバル イベント レジスタを作成します。
  3. 最初のリージョンでイベント ハンドラーを作成し、イベントをキャッチして 2 番目のリージョンでそれらを再ディスパッチします ( を使用buildEventDispatchChain.dispatchEvent)。次に、反対側でも同じことを行います。
于 2013-03-06T14:59:16.467 に答える
0

私の問題は部分的に解決されました。たぶん、私は質問を正しく定式化していません。グラフィックエディターのようなアプリを作成し、ガイド、グリッド、選択ツールなどを備えたスタックペインにツールレイヤーペインを配置し、このレイヤーの子がマウスを処理でき、ペイン自体がマウスイベントに対して透明になる必要があります。

パブリック API ではなく、pickNode をオーバーライドすることで問題は解決しましたが、動作します。多分誰かを助ける。

protected Node impl_pickNodeLocal(double localX, double localY) {
    if (containsBounds(localX, localY)) {
        ObservableList<Node> children = getChildren();
        for (int i = children.size()-1; i >= 0; i--) {
            Node picked = children.get(i).impl_pickNode(localX, localY);
            if (picked != null) return picked;
        }
        // hack to make pane itself transparent for mouse
        // if (contains(localX, localY)) return this;
    }
    return null;
}
于 2013-03-06T17:52:17.127 に答える