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 }