modules/controls/src/main/java/javafx/scene/control/skin/MenuButtonSkin.java

Print this page
rev 9240 : 8076423: JEP 253: Prepare JavaFX UI Controls & CSS APIs for Modularization

*** 21,80 **** * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ ! package com.sun.javafx.scene.control.skin; ! import javafx.event.Event; ! import javafx.event.EventHandler; import javafx.scene.control.MenuButton; import com.sun.javafx.scene.control.behavior.MenuButtonBehavior; /** ! * Skin for MenuButton Control. */ ! public class MenuButtonSkin extends MenuButtonSkinBase<MenuButton, MenuButtonBehavior> { static final String AUTOHIDE = "autoHide"; /*************************************************************************** * * * Constructors * * * **************************************************************************/ /** ! * Creates a new MenuButtonSkin for the given MenuButton * ! * @param menuButton the MenuButton */ ! public MenuButtonSkin(final MenuButton menuButton) { ! super(menuButton, new MenuButtonBehavior(menuButton)); // MenuButton's showing does not get updated when autoHide happens, // as that hide happens under the covers. So we add to the menuButton's // properties map to which the MenuButton can react and update accordingly.. ! popup.setOnAutoHide(new EventHandler<Event>() { ! @Override public void handle(Event t) { ! MenuButton menuButton = (MenuButton)getSkinnable(); // work around for the fact autohide happens twice // remove this check when that is fixed. if (!menuButton.getProperties().containsKey(AUTOHIDE)) { menuButton.getProperties().put(AUTOHIDE, Boolean.TRUE); } - } }); // request focus on content when the popup is shown popup.setOnShown(event -> { ContextMenuContent cmContent = (ContextMenuContent)popup.getSkin().getNode(); if (cmContent != null) cmContent.requestFocus(); }); ! if (menuButton.getOnAction() == null) { ! menuButton.setOnAction(e -> { ! menuButton.show(); ! }); } ! label.setLabelFor(menuButton); } } --- 21,136 ---- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ ! package javafx.scene.control.skin; ! import com.sun.javafx.scene.control.ContextMenuContent; ! import javafx.scene.Node; ! import javafx.scene.control.Control; import javafx.scene.control.MenuButton; import com.sun.javafx.scene.control.behavior.MenuButtonBehavior; /** ! * Default skin implementation for the {@link MenuButton} control. ! * ! * @see MenuButton ! * @since 9 */ ! public class MenuButtonSkin extends MenuButtonSkinBase<MenuButton> { ! ! /*************************************************************************** ! * * ! * Static fields * ! * * ! **************************************************************************/ static final String AUTOHIDE = "autoHide"; + + + + /*************************************************************************** + * * + * Private fields * + * * + **************************************************************************/ + + private final MenuButtonBehavior behavior; + + + /*************************************************************************** * * * Constructors * * * **************************************************************************/ /** ! * Creates a new MenuButtonSkin instance, installing the necessary child ! * nodes into the Control {@link Control#getChildren() children} list, as ! * well as the necessary input mappings for handling key, mouse, etc events. * ! * @param control The control that this skin should be installed onto. */ ! public MenuButtonSkin(final MenuButton control) { ! super(control); ! ! // install default input map for the MenuButton-like controls ! this.behavior = new MenuButtonBehavior(control); ! // control.setInputMap(behavior.getInputMap()); ! // MenuButton's showing does not get updated when autoHide happens, // as that hide happens under the covers. So we add to the menuButton's // properties map to which the MenuButton can react and update accordingly.. ! popup.setOnAutoHide(e -> { ! MenuButton menuButton = getSkinnable(); // work around for the fact autohide happens twice // remove this check when that is fixed. if (!menuButton.getProperties().containsKey(AUTOHIDE)) { menuButton.getProperties().put(AUTOHIDE, Boolean.TRUE); } }); + // request focus on content when the popup is shown popup.setOnShown(event -> { ContextMenuContent cmContent = (ContextMenuContent)popup.getSkin().getNode(); if (cmContent != null) cmContent.requestFocus(); }); ! if (control.getOnAction() == null) { ! control.setOnAction(e -> control.show()); ! } ! ! label.setLabelFor(control); } ! ! ! /*************************************************************************** ! * * ! * Public API * ! * * ! **************************************************************************/ ! ! /** {@inheritDoc} */ ! @Override public void dispose() { ! super.dispose(); ! ! if (behavior != null) { ! behavior.dispose(); ! } ! } ! ! ! ! /*************************************************************************** ! * * ! * Private implementation * ! * * ! **************************************************************************/ ! ! @Override MenuButtonBehavior getBehavior() { ! return behavior; } }