Module  javafx.controls
软件包  javafx.scene.control

Class ContextMenu

  • All Implemented Interfaces:
    StyleableEventTargetSkinnable


    @IDProperty("id")
    public class ContextMenu
    extends PopupControl

    一个包含菜单项的ObservableList的弹出控件。 所述items ObservableList允许任何MenuItem要被插入的类型,包括它的子类MenuMenuItemRadioMenuItemCheckMenuItemCustomMenuItem 如果任意一个Node需要插入菜单,可以使用CustomMenuItem。 这个一般规则的一个例外是SeparatorMenuItem可以用于插入分隔符。

    此类的常见用例是为用户创建和显示上下文菜单。 要使用ContextMenu创建上下文菜单,您可以执行以下操作:

       final ContextMenu contextMenu = new ContextMenu(); contextMenu.setOnShowing(new EventHandler<WindowEvent>() { public void handle(WindowEvent e) { System.out.println("showing"); } }); contextMenu.setOnShown(new EventHandler<WindowEvent>() { public void handle(WindowEvent e) { System.out.println("shown"); } }); MenuItem item1 = new MenuItem("About"); item1.setOnAction(new EventHandler<ActionEvent>() { public void handle(ActionEvent e) { System.out.println("About"); } }); MenuItem item2 = new MenuItem("Preferences"); item2.setOnAction(new EventHandler<ActionEvent>() { public void handle(ActionEvent e) { System.out.println("Preferences"); } }); contextMenu.getItems().addAll(item1, item2); final TextField textField = new TextField("Type Something"); textField.setContextMenu(contextMenu);  

    Control.setContextMenu(javafx.scene.control.ContextMenu)方便的方法可以用于在任何控件上设置上下文菜单。 上述示例导致上下文菜单显示在TextField的右侧Side上。 或者,也可以在控件上设置事件处理程序来调用上下文菜单,如下所示。

       textField.setOnAction(new EventHandler<ActionEvent>() { public void handle(ActionEvent e) { contextMenu.show(textField, Side.BOTTOM, 0, 0); } }); Group root = (Group) scene.getRoot(); root.getChildren().add(textField);  

    在此示例中,当用户点击Button (当然,您应该使用MenuButton控件来执行此操作而不是执行上述操作)时,将显示上下文菜单。

    请注意,上述代码示例中使用的show函数将导致ContextMenu直接出现在TextField下方。 您可以更改Side以获取您期望的结果。

    从以下版本开始:
    JavaFX 2.0
    另请参见:
    MenuItemMenu
    • 构造方法详细信息

      • ContextMenu

        public ContextMenu​()
        创建一个新的ContextMenu
      • ContextMenu

        public ContextMenu​(MenuItem... items)
        创建一个使用给定项目初始化的新的ContextMenu
        参数
        items - 菜单项列表
    • 方法详细信息

      • setOnAction

        public final void setOnAction​(EventHandler<ActionEvent> value)
        设置属性onAction的值。
        Property description:
        当这个ContextMenu包含的项目被激活时,通知回调函数。 当前的实现也通知所有父菜单,因此不需要收听所有子菜单的事件。
      • getOnAction

        public final EventHandler<ActionEvent> getOnAction​()
        获取属性onAction的值。
        Property description:
        当这个ContextMenu包含的项目被激活时,回调功能被通知。 当前的实现也通知所有父菜单,因此不需要收听所有子菜单的事件。
      • getItems

        public final ObservableList<MenuItem> getItems​()
        上下文菜单中的菜单项。 如果这个ObservableList在运行时被修改,ContextMenu将按预期更新。
        结果
        此上下文菜单上的菜单项
        另请参见:
        MenuItem
      • show

        public void show​(Node anchor,
                         Side side,
                         double dx,
                         double dy)
        示出了ContextMenu相对于给定锚节点,在由指定的侧hposvpos参数,并且由给定的偏移dxdy分别用于x轴和y轴,的值。 如果没有足够的空间,菜单将移动到相反的一侧,并且不应用偏移量。

        为了澄清hposvpos参数的目的,请考虑它们是相对于锚节点。 因此, hposvposCENTER将意味着ContextMenu出现在锚点的顶部, ContextMenu的(0,0)位置位于ContextMenu的(0,0)处。 hpos的右然后将转移的ContextMenu使得其左上(0,0)位置将被附接至锚定件的右上方位置。

        此功能可用于精细调整菜单的位置,相对于父节点,以确保紧密对齐。

        参数
        anchor - 锚节点
        side - 一边
        dx - x轴的dx值
        dy - y轴的dy值
      • show

        public void show​(Node anchor,
                         double screenX,
                         double screenY)
        在指定的屏幕坐标处显示ContextMenu 如果在指定位置没有足够的空间来显示ContextMenu给出其尺寸要求,则必须进行调整以使ContextMenu回到屏幕上。 这也意味着ContextMenu不会跨越多个显示器。
        重写:
        showPopupWindow
        参数
        anchor - 锚节点
        screenX - 锚点在屏幕坐标中的x位置
        screenY - 锚点在屏幕坐标中的y位置
      • hide

        public void hide​()
        隐藏这个ContextMenu和任何可见的子菜单,假设当这个函数被调用时显示ContextMenu

        如果这个ContextMenu没有显示,那么没有任何反应。

        重写:
        hidePopupWindow
      • createDefaultSkin

        protected Skin<?> createDefaultSkin​()
        为此控件创建一个新的默认皮肤实例。 如果没有通过CSS -fx-skin提供皮肤或者在具有setSkin(...)的子类中显式设置,则调用此控件创建皮肤。
        重写:
        createDefaultSkinPopupControl
        结果
        此控件的默认皮肤的新实例。 如果为null,则控件将没有皮肤,除非由css提供。