--- old/src/java.desktop/macosx/classes/com/apple/eawt/_AppMenuBarHandler.java 2017-04-13 21:21:52.000000000 +0300 +++ new/src/java.desktop/macosx/classes/com/apple/eawt/_AppMenuBarHandler.java 2017-04-13 21:21:52.000000000 +0300 @@ -25,9 +25,13 @@ package com.apple.eawt; +import java.awt.Container; import java.awt.Frame; -import javax.swing.*; + +import javax.swing.JFrame; +import javax.swing.JLayeredPane; +import javax.swing.JMenuBar; import javax.swing.plaf.MenuBarUI; import com.apple.laf.ScreenMenuBar; @@ -102,10 +106,15 @@ return; } - final MenuBarUI ui = menuBar.getUI(); + Container parent = menuBar.getParent(); + if (parent instanceof JLayeredPane) { + ((JLayeredPane) parent).remove(menuBar); + } + + MenuBarUI ui = menuBar.getUI(); if (!(ui instanceof AquaMenuBarUI)) { - // Aqua was not installed - throw new IllegalStateException("Application.setDefaultMenuBar() only works with the Aqua Look and Feel"); + ui = new AquaMenuBarUI(); + menuBar.setUI(ui); } final AquaMenuBarUI aquaUI = (AquaMenuBarUI)ui; --- old/src/java.desktop/macosx/classes/com/apple/laf/AquaMenuBarUI.java 2017-04-13 21:21:54.000000000 +0300 +++ new/src/java.desktop/macosx/classes/com/apple/laf/AquaMenuBarUI.java 2017-04-13 21:21:54.000000000 +0300 @@ -50,7 +50,7 @@ public void uninstallUI(final JComponent c) { if (fScreenMenuBar != null) { final JFrame frame = (JFrame)(c.getTopLevelAncestor()); - if (frame.getMenuBar() == fScreenMenuBar) { + if (frame != null && frame.getMenuBar() == fScreenMenuBar) { frame.setMenuBar((MenuBar)null); } fScreenMenuBar = null; --- old/src/java.desktop/share/classes/java/awt/Desktop.java 2017-04-13 21:21:55.000000000 +0300 +++ new/src/java.desktop/share/classes/java/awt/Desktop.java 2017-04-13 21:21:55.000000000 +0300 @@ -992,8 +992,6 @@ /** * Sets the default menu bar to use when there are no active frames. * - * @implNote Aqua Look and Feel should be active to support this on Mac OS. - * * @param menuBar to use when no other frames are active * @throws SecurityException if a security manager exists and it denies the * {@code RuntimePermission("canProcessApplicationEvents")} permission. --- old/src/java.desktop/share/classes/javax/swing/JRootPane.java 2017-04-13 21:21:57.000000000 +0300 +++ new/src/java.desktop/share/classes/javax/swing/JRootPane.java 2017-04-13 21:21:56.000000000 +0300 @@ -541,8 +541,10 @@ layeredPane.remove(menuBar); menuBar = menu; - if(menuBar != null) + if(menuBar != null) { + menuBar.updateUI(); layeredPane.add(menuBar, JLayeredPane.FRAME_CONTENT_LAYER); + } } /**