Использование FXML для создания ContextMenu на панели

У нас есть рабочий пример определения ContextMenu на панели в JavaFX FXML, но я не уверен, что он оптимален. В настоящее время только стандартные элементы управления JavaFX (например, Button, TextField) определяют свойство для указания всплывающего ContextMenu. Тем не менее, я хотел, чтобы всплывающее меню появлялось где-нибудь на панели, в моем случае это VBox.

Я принял подход расширения VBox для поддержки контекстного меню. Это 'неуклюжий» Решение, но работает. Есть ли лучший подход? Я скучаю по какой-то фундаментальной концепции?

Вот мое решение ...

FXML:








    
        
        
        
            
                
                    
                        
                    
                
            
        
    

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;
    }

}

Контроллер ...

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();
    }
}

Главное приложение ...

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);
     }
}

Ответы на вопрос(2)

Ваш ответ на вопрос