コンテキスト メニューをスクロール ペインに追加することはできますが、他の種類のペインには追加できません。なんで?
2 に答える
FXMLの仕組み
FXML は、リフレクションを使用して (または特殊なビルダー クラスを使用して) Java API をイントロスペクトすることによって機能します。FXML の詳細については、Introduction to FXMLドキュメントを参照してください。
FXML マークアップを使用して JavaFX のペインで ContextMenus を定義できない理由
コントロールにはcontextMenu プロパティがあります。ScrollPaneは Control です。StackPaneなどの他のペイン タイプはコントロールではありません。これらの他のペイン タイプには、contextMenu への参照を含むように設定できる対応するプロパティがないため、FXML を使用してこれらのペイン タイプに contextMenu を定義することはできません。
同様の理由で、ペインにツールチップを定義することもできません。
FXML コントローラーでペインの ContextMenu を定義する方法
たとえば、FXML コントローラーに次のコードを配置することにより、 contextMenu表示APIを使用して、コードを介してペイン (およびコントロールではないその他の任意のノード) にコンテキスト メニューを設定できます。
@FXML StackPane stack;
// . . .
public void initialize() {
final ContextMenu contextMenu = new ContextMenu(new MenuItem("xyzzy"));
stack.setOnMouseClicked(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent mouseEvent) {
contextMenu.show(
stack,
mouseEvent.getScreenX(),
mouseEvent.getScreenY()
);
}
});
}
ContextMenu プロパティを追加しない理由
ノードは contextMenu プロパティを持つことができ、FXML マークアップを介してペインで ContextMenus を定義できるようになります。
Nodeには contextMenu プロパティがないのに Control にはある理由は、ContextMenu 自体が Control であるためです。ContextMenu プロパティをノードに追加すると、JavaFX 実装のコア シーン グラフ モデル コードがコントロール モジュール (シーン グラフ モジュールに依存する) に依存することになり、循環依存になります。これは、コア JavaFX シーン グラフとレンダリング エンジンを含むが、コントロールを含まない非常に軽量な Java ランタイム システムの出荷を妨げます (今日、そのようなシステムを出荷する人はいません)。
機能リクエストを提出する方法
SceneBuilder を使用して任意のペインでコンテキスト メニューを定義できるようにシステムを変更する必要があると思われる場合は、JavaFX 課題トラッカーに対して機能リクエストを提出できます(そうする場合は、この質問へのリンクを機能リクエストに含めてください)。 .