在JavaFX中,一个完全在悬停时触发的菜单?

在JavaFX中,一个完全在悬停时触发的菜单?,java,javafx,menu,javafx-8,Java,Javafx,Menu,Javafx 8,我已经查看了一些与菜单相关的JavaFX类,但找不到我想要的。我想实现一些类似于菜单栏的功能,只是希望它在悬停时打开菜单,而不是单击时打开。虽然我完全可以自己从零开始构建一些东西,但如果已经有一些东西允许我做类似的事情,那将是浪费时间。有人知道我是怎么做的吗?我想你在找类javafx.scene.control.ContextMenu和方法show(节点锚定,双屏幕x,双屏幕)如果你使用查找(),就有可能做到这一点。您可以轻松地获取包含菜单的容器,然后在其上应用setonmouseintered

我已经查看了一些与菜单相关的JavaFX类,但找不到我想要的。我想实现一些类似于
菜单栏
的功能,只是希望它在悬停时打开菜单,而不是单击时打开。虽然我完全可以自己从零开始构建一些东西,但如果已经有一些东西允许我做类似的事情,那将是浪费时间。有人知道我是怎么做的吗?

我想你在找类
javafx.scene.control.ContextMenu
和方法
show(节点锚定,双屏幕x,双屏幕)
如果你使用
查找()
,就有可能做到这一点。您可以轻松地获取包含菜单的容器,然后在其上应用
setonmouseintered()
setonmouseexted()
,以捕获每个菜单上的鼠标事件

以下是一个例子:

import javafx.application.Application;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.control.Menu;
import javafx.scene.control.MenuBar;
import javafx.scene.control.MenuItem;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.stage.Stage;

public class Main extends Application {

    @Override
    public void start(Stage primaryStage) {

        BorderPane mainPane = new BorderPane();

        MenuBar menuBar = new MenuBar();

        Menu editMenu = new Menu("File");
        MenuItem fileMenuItem1 = new MenuItem("Item 1");
        MenuItem fileMenuItem2 = new MenuItem("Item 2");
        MenuItem fileMenuItem3 = new MenuItem("Item 3");
        editMenu.getItems().addAll(fileMenuItem1, fileMenuItem2, fileMenuItem3);

        Menu fileMenu = new Menu("Edit");
        MenuItem fileMenu1 = new MenuItem("Item 1");
        MenuItem fileMenu2 = new MenuItem("Item 2");
        MenuItem fileMenu3 = new MenuItem("Item 3");
        fileMenu.getItems().addAll(fileMenu1, fileMenu2, fileMenu3);

        menuBar.getMenus().addAll(editMenu, fileMenu);

        mainPane.setTop(menuBar);

        Scene scene = new Scene(mainPane, 300, 300);
        Stage stage = new Stage();
        stage.setScene(scene);
        stage.show();

        // Find menubar HBox holding the menus
        HBox container = (HBox) menuBar.lookup("HBox");

        for(int i = 0 ; i < container.getChildren().size() ; i++) {
            Node parentNode = container.getChildren().get(i);
            Menu menu = menuBar.getMenus().get(i);

            parentNode.setOnMouseMoved(e->{
                menu.show();
            });
        }
    }

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

使用自定义
菜单栏
并更改其侦听器?签出,但我需要上下文菜单作为主窗口场景图的一部分。
[MenuBar@5e57a6ce[styleClass=menu-bar], HBox@13ccf856[styleClass=container], MenuBarSkin$MenuBarButton[id=null, styleClass=menu-button menu]'File', MenuButtonSkinBase$MenuLabeledImpl@25917f7f[styleClass=label]'File', Text[text="File", x=0.0, y=0.0, alignment=LEFT, origin=BASELINE, boundsType=LOGICAL_VERTICAL_CENTER, font=Font[name=System Regular, family=System, style=Regular, size=12.0], fontSmoothingType=LCD, fill=0x333333ff], StackPane@c341eae[styleClass=arrow-button], StackPane@7b8501c0[styleClass=arrow], MenuBarSkin$MenuBarButton[id=null, styleClass=menu-button menu]'Edit', MenuButtonSkinBase$MenuLabeledImpl@4d8224b7[styleClass=label]'Edit', Text[text="Edit", x=0.0, y=0.0, alignment=LEFT, origin=BASELINE, boundsType=LOGICAL_VERTICAL_CENTER, font=Font[name=System Regular, family=System, style=Regular, size=12.0], fontSmoothingType=LCD, fill=0x333333ff], StackPane@3d75fcac[styleClass=arrow-button], StackPane@71f02eed[styleClass=arrow]]