This is bug in Oracle JDK 7 (it cannot be reproduced in Open JDK 7 by the way).
To fix this you can make a workaround (yes, this is just a workaround, there is no guarantees that it won't break with some Java update) so that the window created for popup-menu will become non-opaque as soon as it shows up, then it will be displayed properly. Atleast for now. Here is how this can be done for Java version 7 and later:
PropertyChangeListener propertyChangeListener = new PropertyChangeListener ()
{
@Override
public void propertyChange ( final PropertyChangeEvent evt )
{
if ( evt.getNewValue () == Boolean.TRUE )
{
// Retrieving popup menu window (we won't find it if it is inside of parent frame)
final Window ancestor = getWindowAncestor ( popupMenu );
if ( ancestor != null && ancestor.getClass ().getCanonicalName ().endsWith ( "HeavyWeightWindow" ) )
{
// Checking that parent window for our window is opaque, only then setting opacity
final Component parent = ancestor.getParent ();
if ( parent != null && parent instanceof Window && parent.getBackground ().getAlpha () == 0 )
{
// Making popup menu window non-opaque
ancestor.setBackground ( new Color ( 0, 0, 0, 0 ) );
}
}
}
}
private Window getWindowAncestor ( Component component )
{
if ( component == null )
{
return null;
}
if ( component instanceof Window )
{
return ( Window ) component;
}
for ( Container p = component.getParent (); p != null; p = p.getParent () )
{
if ( p instanceof Window )
{
return ( Window ) p;
}
}
return null;
}
};
popupMenu.addPropertyChangeListener ( "visible", propertyChangeListener );
You will have to put some more effort if you also want to support JDK 6- versions because that code won't even compile on earlier JDK versions (there are no "set/getBackground" methods in Window in earlier versions).