Использование 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);
}
}