1 package com.sun.javafx.scene.control;
   2 
   3 import javafx.beans.value.ChangeListener;
   4 import javafx.collections.ListChangeListener;
   5 import javafx.scene.AccessibleAttribute;
   6 import javafx.scene.AccessibleRole;
   7 import javafx.scene.control.Menu;
   8 import javafx.scene.control.MenuButton;
   9 import javafx.scene.control.MenuItem;
  10 import javafx.scene.control.skin.MenuBarSkin;
  11 
  12 public class MenuBarButton extends MenuButton {
  13     public ChangeListener<Boolean> menuListener;
  14     public MenuBarSkin menuBarSkin;
  15     public Menu menu;
  16 
  17     private final ListChangeListener<MenuItem> itemsListener;
  18     private final ListChangeListener<String> styleClassListener;
  19 
  20     public MenuBarButton(MenuBarSkin menuBarSkin, Menu menu) {
  21         super(menu.getText(), menu.getGraphic());
  22         this.menuBarSkin = menuBarSkin;
  23         setAccessibleRole(AccessibleRole.MENU);
  24 
  25         // listen to changes in menu items & update menuButton items
  26         menu.getItems().addListener(itemsListener = c -> {
  27             while (c.next()) {
  28                 getItems().removeAll(c.getRemoved());
  29                 getItems().addAll(c.getFrom(), c.getAddedSubList());
  30             }
  31         });
  32         menu.getStyleClass().addListener(styleClassListener = c -> {
  33             while(c.next()) {
  34                 for(int i=c.getFrom(); i<c.getTo(); i++) {
  35                     getStyleClass().add(menu.getStyleClass().get(i));
  36                 }
  37                 for (String str : c.getRemoved()) {
  38                     getStyleClass().remove(str);
  39                 }
  40             }
  41         });
  42         idProperty().bind(menu.idProperty());
  43     }
  44 
  45     public MenuBarSkin getMenuBarSkin() {
  46         return menuBarSkin;
  47     }
  48 
  49     public void clearHover() {
  50         setHover(false);
  51     }
  52 
  53     public void setHover() {
  54         setHover(true);
  55 
  56             /* Transfer the a11y focus to an item in the menu bar. */
  57         menuBarSkin.getSkinnable().notifyAccessibleAttributeChanged(AccessibleAttribute.FOCUS_NODE);
  58     }
  59 
  60     public void dispose() {
  61         menu.getItems().removeListener(itemsListener);
  62         menu.getStyleClass().removeListener(styleClassListener);
  63         idProperty().unbind();
  64     }
  65 
  66     @Override
  67     public Object queryAccessibleAttribute(AccessibleAttribute attribute, Object... parameters) {
  68         switch (attribute) {
  69             case FOCUS_ITEM: return MenuBarButton.this;
  70             default: return super.queryAccessibleAttribute(attribute, parameters);
  71         }
  72     }
  73 }