--- old/modules/javafx.controls/src/main/java/javafx/scene/control/MenuButton.java 2017-09-14 15:51:28.900287133 +0530 +++ new/modules/javafx.controls/src/main/java/javafx/scene/control/MenuButton.java 2017-09-14 15:51:28.732287133 +0530 @@ -32,6 +32,7 @@ import javafx.collections.ObservableList; import javafx.event.ActionEvent; import javafx.event.Event; +import javafx.event.EventHandler; import javafx.event.EventType; import javafx.geometry.Side; import javafx.scene.AccessibleAction; @@ -269,6 +270,95 @@ return popupSide; } + /** + * Called just prior to the {@code ContextMenu} being shown. + * @return the on showing property + * @since 10 + */ + public final ObjectProperty> onShowingProperty() { return onShowing; } + public final void setOnShowing(EventHandler value) { onShowingProperty().set(value); } + public final EventHandler getOnShowing() { return onShowingProperty().get(); } + private ObjectProperty> onShowing = new ObjectPropertyBase>() { + @Override protected void invalidated() { + setEventHandler(ON_SHOWING, get()); + } + + @Override public Object getBean() { + return MenuButton.this; + } + + @Override public String getName() { + return "onShowing"; + } + }; + + /** + * Called just after the {@code ContextMenu} is shown. + * @return the on shown property + * @since 10 + */ + public final ObjectProperty> onShownProperty() { return onShown; } + public final void setOnShown(EventHandler value) { onShownProperty().set(value); } + public final EventHandler getOnShown() { return onShownProperty().get(); } + private ObjectProperty> onShown = new ObjectPropertyBase>() { + @Override protected void invalidated() { + setEventHandler(ON_SHOWN, get()); + } + + @Override public Object getBean() { + return MenuButton.this; + } + + @Override public String getName() { + return "onShown"; + } + }; + + /** + * Called just prior to the {@code ContextMenu} being hidden. + * @return the on hiding property + * @since 10 + */ + public final ObjectProperty> onHidingProperty() { return onHiding; } + public final void setOnHiding(EventHandler value) { onHidingProperty().set(value); } + public final EventHandler getOnHiding() { return onHidingProperty().get(); } + private ObjectProperty> onHiding = new ObjectPropertyBase>() { + @Override protected void invalidated() { + setEventHandler(ON_HIDING, get()); + } + + @Override public Object getBean() { + return MenuButton.this; + } + + @Override public String getName() { + return "onHiding"; + } + }; + + /** + * Called just after the {@code ContextMenu} has been hidden. + * @return the on hidden property + * @since 10 + */ + public final ObjectProperty> onHiddenProperty() { return onHidden; } + public final void setOnHidden(EventHandler value) { onHiddenProperty().set(value); } + public final EventHandler getOnHidden() { return onHiddenProperty().get(); } + private ObjectProperty> onHidden = new ObjectPropertyBase>() { + @Override protected void invalidated() { + setEventHandler(ON_HIDDEN, get()); + } + + @Override public Object getBean() { + return MenuButton.this; + } + + @Override public String getName() { + return "onHidden"; + } + }; + + /*************************************************************************** * * * Control methods * --- old/modules/javafx.controls/src/test/java/test/javafx/scene/control/MenuButtonTest.java 2017-09-14 15:51:29.440287133 +0530 +++ new/modules/javafx.controls/src/test/java/test/javafx/scene/control/MenuButtonTest.java 2017-09-14 15:51:29.256287133 +0530 @@ -287,41 +287,97 @@ assertEquals(mb1.getHeight(), mb2.getHeight(), 0.00001); } - boolean onShowingPass; - boolean onShownPass; - boolean onHidingPass; - boolean onHiddenPass; - @Test public void test_jdk_8175963_showHideEvents() { + int onShowingPass; + int onShownPass; + int onHidingPass; + int onHiddenPass; + // Test for JDK-8175963 + @Test public void test_jdk_addOnShowHideEvents() { + onShowingPass = 0; + onShownPass = 0; + onHidingPass = 0; + onHiddenPass = 0; MenuItem it1 = new MenuItem("1"); MenuButton mbtn = new MenuButton("MenuButton", null, it1); - mbtn.addEventHandler(MenuButton.ON_SHOWING, event -> { - assertEquals("event is not of type MenuButton.ON_SHOWING", - event.getEventType(), MenuButton.ON_SHOWING); - onShowingPass = true; - }); - mbtn.addEventHandler(MenuButton.ON_SHOWN, event -> { - assertEquals("event is not of type MenuButton.ON_SHOWN", - event.getEventType(), MenuButton.ON_SHOWN); - onShownPass = true; - }); - mbtn.addEventHandler(MenuButton.ON_HIDING, event -> { - assertEquals("event is not of type MenuButton.ON_HIDING", - event.getEventType(), MenuButton.ON_HIDING); - onHidingPass = true; - }); - mbtn.addEventHandler(MenuButton.ON_HIDDEN, event -> { - assertEquals("event is not of type MenuButton.ON_HIDDEN", - event.getEventType(), MenuButton.ON_HIDDEN); - onHiddenPass = true; - }); + for (int i = 0; i < 5; ++i) { + mbtn.addEventHandler(MenuButton.ON_SHOWING, event -> { + assertEquals("event is not of type MenuButton.ON_SHOWING", + event.getEventType(), MenuButton.ON_SHOWING); + onShowingPass++; + }); + mbtn.addEventHandler(MenuButton.ON_SHOWN, event -> { + assertEquals("event is not of type MenuButton.ON_SHOWN", + event.getEventType(), MenuButton.ON_SHOWN); + onShownPass++; + }); + mbtn.addEventHandler(MenuButton.ON_HIDING, event -> { + assertEquals("event is not of type MenuButton.ON_HIDING", + event.getEventType(), MenuButton.ON_HIDING); + onHidingPass++; + }); + mbtn.addEventHandler(MenuButton.ON_HIDDEN, event -> { + assertEquals("event is not of type MenuButton.ON_HIDDEN", + event.getEventType(), MenuButton.ON_HIDDEN); + onHiddenPass++; + }); + } mbtn.show(); mbtn.hide(); - assertTrue("OnShowing event not received", onShowingPass); - assertTrue("onShown event not received", onShownPass); - assertTrue("onHiding event not received", onHidingPass); - assertTrue("onHidden event not received", onHiddenPass); + assertTrue("MenuButton.ON_SHOWING event should be received 5 times. but received: " + + onShowingPass + " times.", (5 == onShowingPass)); + assertTrue("MenuButton.ON_SHOWN event should be received 5 times. but received: " + + onShownPass + " times.", (5 == onShownPass)); + assertTrue("MenuButton.ON_HIDING event should be received 5 times. but received: " + + onHidingPass + " times.", (5 == onHidingPass)); + assertTrue("MenuButton.ON_HIDDEN event should be received 5 times. but received: " + + onHiddenPass + " times.", (5 == onHiddenPass)); + } + + + // Test for JDK-8177633 + @Test public void test_jdk_setOnShowHideEvents() { + onShowingPass = 0; + onShownPass = 0; + onHidingPass = 0; + onHiddenPass = 0; + MenuItem it1 = new MenuItem("1"); + MenuButton mbtn = new MenuButton("MenuButton", null, it1); + for (int i = 0; i < 5; ++i) { + mbtn.setOnShowing(event -> { + assertEquals("event is not of type MenuButton.ON_SHOWING", + event.getEventType(), MenuButton.ON_SHOWING); + onShowingPass++;; + }); + mbtn.setOnShown(event -> { + assertEquals("event is not of type MenuButton.ON_SHOWN", + event.getEventType(), MenuButton.ON_SHOWN); + onShownPass++; + }); + mbtn.setOnHiding(event -> { + assertEquals("event is not of type MenuButton.ON_HIDING", + event.getEventType(), MenuButton.ON_HIDING); + onHidingPass++; + }); + mbtn.setOnHidden(event -> { + assertEquals("event is not of type MenuButton.ON_HIDDEN", + event.getEventType(), MenuButton.ON_HIDDEN); + onHiddenPass++; + }); + } + + mbtn.show(); + mbtn.hide(); + + assertTrue("MenuButton.ON_SHOWING event should be received only once. but received: " + + onShowingPass + " times.", (1 == onShowingPass)); + assertTrue("MenuButton.ON_SHOWN event should be received only once. but received: " + + onShownPass + " times.", (1 == onShownPass)); + assertTrue("MenuButton.ON_HIDING event should be received only once. but received: " + + onHidingPass + " times.", (1 == onHidingPass)); + assertTrue("MenuButton.ON_HIDDEN event should be received only once. but received: " + + onHiddenPass + " times.", (1 == onHiddenPass)); } }