Usando FXML para criar ContextMenu dentro de um painel

Eu tenho um exemplo de trabalho para definir um ContextMenu em um painel no JavaFX FXML, mas não tenho certeza se é o ideal. Atualmente, apenas os controles padrão do JavaFX (por exemplo, Button, TextField) definem uma propriedade para especificar um ContextMenu pop-up. No entanto, eu queria ter um menu pop-up aparecer em qualquer lugar em um painel, no meu caso, um VBox.

Tomei a abordagem de estender o VBox para suportar um menu de contexto. É uma solução "desajeitada", mas funciona. Existe uma abordagem melhor? Estou sentindo falta de algum conceito fundamental?

Aqui está a minha solução ...

FXML:

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import custommenu.view.ContextMenuPane?>

<AnchorPane xmlns:fx="http://javafx.com/fxml" fx:controller="custommenu.controller.CustomMenuController">
    <children>
        <VBox fx:id="vbox" onContextMenuRequested="#showMenu"
            onMousePressed="#hideMenu" prefHeight="200" prefWidth="200">
        </VBox>
        <ContextMenuPane>
            <contextMenu>
                <ContextMenu fx:id="menu">
                    <items>
                        <MenuItem text="add" onAction="#add" />
                    </items>
                </ContextMenu>
            </contextMenu>
        </ContextMenuPane>
    </children>
</AnchorPane>

CustomMenuPane ...

package custommenu.view;

import javafx.scene.control.ContextMenu;
import javafx.scene.layout.Pane;

public class ContextMenuPane extends Pane {

    private ContextMenu contextMenu;

    public void setContextMenu(ContextMenu contextMenu) {
        this.contextMenu = contextMenu;
    }

    public ContextMenu getContextMenu() {
        return contextMenu;
    }

}

Controlador...

package custommenu.controller;

import javafx.fxml.FXML;
import javafx.scene.control.ContextMenu;
import javafx.scene.input.ContextMenuEvent;
import javafx.scene.layout.VBox;

public class CustomMenuController {

    @FXML private VBox vbox;
    @FXML private ContextMenu menu;

    @FXML public void add() {
        System.out.println("add");
    }

    @FXML
    public void showMenu(ContextMenuEvent event) {
        System.out.println("showMenu");

        menu.show(vbox, event.getScreenX(), event.getScreenY());
        event.consume();
    }

    @FXML public void hideMenu() {
        menu.hide();
    }
}

App principal ...

package custommenu;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;

public class CustomMenuApplication extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception {
        Pane myPane = (Pane)FXMLLoader.load(getClass().getResource("/custommenu/custom_menu_main.fxml"));
        Scene scene = new Scene(myPane);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

     public static void main(String[] args) {
         launch(args);
     }
}

questionAnswers(2)

yourAnswerToTheQuestion