マウス/任意の座標の下にあるコントロール(または最初のコントロール)のリストを取得するにはどうすればよいですか?WPFにはVisualTreeHelper.HitTestがあり、ある時点ですべてのコントロールをフィルターで除外するために使用できるコールバックがあることを知っています。JavaFXに似たものはありますか?(または、特定のポイントの最初の要素を気にするだけです)ノードの座標を取得するための情報はたくさんありますが、座標によってノードを取得する方法についての情報はありません。
1 に答える
2021年12月の更新
回答で参照されているimpl_pickNode関数は削除され、代替のピッキング機能に置き換えられました。
同様の機能がjavafx.scene.Sceneソースで示されています。ここには、JavaFXシステムのテストに使用される関数があります。
/**
* Note: The only user of this method is in unit test: PickAndContainTest.
*/
Node test_pick(double x, double y) {
inMousePick = true;
PickResult result = mouseHandler.pickNode(new PickRay(x, y, 1,
Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY));
inMousePick = false;
if (result != null) {
return result.getIntersectedNode();
}
return null;
}
この機能は、JavaFXシステム内のプライベート機能であり、サポートされているパブリックAPIとして公開されていません。したがって、JavaFXはこれを行う方法を内部的に認識しており、内部ソースを調査して内部APIを使用し、モジュール性を破り、下位互換性を損なう場合は、おそらく結果を得ることができます。
を使用できますnode.impl_pickNode(x,y)
。
メソッドからのドキュメント(ソースimpl_pickNode
からコピー)。
/**
* Finds a top-most child node that contains the given coordinates.
*
* Returns the picked node, null if no such node was found.
*
* @deprecated This is an internal API that is not intended for use
* and will be removed in the next version.
**/
public final Node impl_pickNode(double parentX, double parentY)
コメント内の非推奨の警告に注意深く注意し、自己責任で使用してください。
アップデート
JavaFX課題追跡システムには既存の機能要求があります。FXはParent.pick()ルーチンを提供する必要があります。この機能リクエストは、将来廃止されることのないパブリックピッキングAPIに対するものです。要求された機能は次のように説明されます:「ルーチンは、単一のノード、またはz座標順に並べられたマウスの下のすべてのノードのリストを返す可能性があります」。この機能は、最初のJDK8リリース後のリリースである「VanNess」リリースまで実装が予定されていません(つまり、この機能は早くても2013年のクリスマスまで利用できません)。