-
Enhancement
-
Resolution: Duplicate
-
P4
-
None
-
5.0
-
x86
-
windows_xp
A DESCRIPTION OF THE REQUEST :
JPopupMenu without an invoker should be treated as a desktop popup menu. This change does not actually require any API change and is unlikely to break any backwards compatibility so please consider it for a pre-Mustang release.
Whenever a JPopupMenu is used with no invoker, Java should interpret this to mean it is a "desktop popup". That is, a popup that does not need to respect the screen insets. This popup should be allowed to cover the taskbar.
This is easy to implement. Simple modify javax.swing.JPopupMenu.adjustPopupLocationToFitScreen(). The first line currently reads:
if(popupPostionFixDisabled == true || GraphicsEnvironment.isHeadless())
return p;
The new version should read:
if(popupPostionFixDisabled == true || GraphicsEnvironment.isHeadless() || invoker==null)
return p;
The heavyweight component should also use:
SetWindowPos(dsi_win32->hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE));
to set its z-position to top-most since this is the correct behavior for all pop-ups under Win32 (whether normal JPopupMenus or desktop JPopupMenus).
JUSTIFICATION :
Currently there is no way to implement task-bar popup menus using pure Java. This is required for the implementation of a System-Tray API, as used by JDIC (see: https://jdic.dev.java.net/)
The proposed new behavior is consistent with the desired meaning/design of JPopupMenu.
CUSTOMER SUBMITTED WORKAROUND :
A workaround involves heavy use of JNI and in-memory class rewriting. Even this solution involves noticable flickering as the popup is displayed in one position, then JNI is invoked to modify its z-position, then it is repositioned over the taskbar. The flickering is very noticable.
###@###.### 2004-11-09 04:10:09 GMT
JPopupMenu without an invoker should be treated as a desktop popup menu. This change does not actually require any API change and is unlikely to break any backwards compatibility so please consider it for a pre-Mustang release.
Whenever a JPopupMenu is used with no invoker, Java should interpret this to mean it is a "desktop popup". That is, a popup that does not need to respect the screen insets. This popup should be allowed to cover the taskbar.
This is easy to implement. Simple modify javax.swing.JPopupMenu.adjustPopupLocationToFitScreen(). The first line currently reads:
if(popupPostionFixDisabled == true || GraphicsEnvironment.isHeadless())
return p;
The new version should read:
if(popupPostionFixDisabled == true || GraphicsEnvironment.isHeadless() || invoker==null)
return p;
The heavyweight component should also use:
SetWindowPos(dsi_win32->hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE));
to set its z-position to top-most since this is the correct behavior for all pop-ups under Win32 (whether normal JPopupMenus or desktop JPopupMenus).
JUSTIFICATION :
Currently there is no way to implement task-bar popup menus using pure Java. This is required for the implementation of a System-Tray API, as used by JDIC (see: https://jdic.dev.java.net/)
The proposed new behavior is consistent with the desired meaning/design of JPopupMenu.
CUSTOMER SUBMITTED WORKAROUND :
A workaround involves heavy use of JNI and in-memory class rewriting. Even this solution involves noticable flickering as the popup is displayed in one position, then JNI is invoked to modify its z-position, then it is repositioned over the taskbar. The flickering is very noticable.
###@###.### 2004-11-09 04:10:09 GMT
- duplicates
-
JDK-6421284 JPopupMenu behaves incorrectly with invoker being set to null
- Resolved