JDK-6415145 : REGRESSION: Selected item is not being updated while dragging above popup menu
  • Type: Bug
  • Component: client-libs
  • Sub-Component: javax.swing
  • Affected Version: 6
  • Priority: P3
  • Status: Resolved
  • Resolution: Fixed
  • OS: linux
  • CPU: x86
  • Submitted: 2006-04-19
  • Updated: 2011-01-19
  • Resolved: 2006-05-31
The Version table provides details related to the release that this issue/RFE will be addressed.

Unresolved : Release in which this issue/RFE will be addressed.
Resolved: Release in which this issue/RFE has been resolved.
Fixed : Release in which this issue/RFE has been fixed. The release containing this fix may be available for download as an Early Access Release or a General Availability Release.

To download the current JDK release, click here.
JDK 6
6 b86Fixed
Related Reports
Relates :  
Relates :  
Description
If you are showing popup on mouse press and continue drag w/o releasing mouse button,
then menu item under mouse is not selected.

Here is a test to reproduce the problem:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class SwingMenus {
    static JFrame frame;
    static JButton button;
    static JPopupMenu menu;
    static class Listener extends MouseAdapter {
        public void mousePressed(MouseEvent e) {
            if (e.isPopupTrigger()) {
                menu.show(button, e.getX(), e.getY());
            }
        }

        public void mouseReleased(MouseEvent e) {
            if (e.isPopupTrigger()) {
                menu.show(button, e.getX(), e.getY());
            }
        }
    }
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() 
            {
                public void run() {
                    frame = new JFrame("test frame");
                    button = new JButton("test button");
                    menu = new JPopupMenu("test menu");
                    menu.add(new JMenuItem("item 1"));
                    menu.add(new JMenuItem("item 2"));
                    JMenu submenu1 = new JMenu("submenu 1");
                    menu.add(submenu1);
                    submenu1.add(new JMenuItem("item 1.1"));
                    submenu1.add(new JMenuItem("item 1.2"));
                    JMenu submenu2 = new JMenu("submenu 2");
                    menu.add(submenu2);
                    submenu2.add(new JMenuItem("item 2.1"));
                    submenu2.add(new JMenuItem("item 2.2"));
                    JMenu submenu21 = new JMenu("submenu 2");
                    submenu2.add(submenu21);
                    submenu21.add(new JMenuItem("item 2.1"));
                    submenu21.add(new JMenuItem("item 2.2"));
                    menu.add(new JSeparator());
                    menu.add(new JMenuItem("item 3"));
                    menu.add(new JMenuItem("item 4"));
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.setSize(200, 200);
                    frame.add(menu);
                    frame.add(button);
                    button.addMouseListener(new Listener());
                    frame.setVisible(true);
                }
            });
    }
}
I cannot reproduce the bug in 1.5.0_06. 
I can reproduce it in 1.6b65, but only with modified test case:

---- Begin of source ---
import java.awt.event.*;
import javax.swing.*;

public class SwingMenus {
    static JFrame frame;
    static JButton button;
    static JPopupMenu menu;

    static class Listener extends MouseAdapter {
        public void mousePressed(MouseEvent e) {
            menu.show(button, e.getX(), e.getY());
        }

        public void mouseReleased(MouseEvent e) {
        }
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                frame = new JFrame("test frame");
                button = new JButton("test button");
                menu = new JPopupMenu("test menu");
                menu.add(new JMenuItem("item 1"));
                menu.add(new JMenuItem("item 2"));
                JMenu submenu1 = new JMenu("submenu 1");
                menu.add(submenu1);
                submenu1.add(new JMenuItem("item 1.1"));
                submenu1.add(new JMenuItem("item 1.2"));
                JMenu submenu2 = new JMenu("submenu 2");
                menu.add(submenu2);
                submenu2.add(new JMenuItem("item 2.1"));
                submenu2.add(new JMenuItem("item 2.2"));
                JMenu submenu21 = new JMenu("submenu 2");
                submenu2.add(submenu21);
                submenu21.add(new JMenuItem("item 2.1"));
                submenu21.add(new JMenuItem("item 2.2"));
                menu.add(new JSeparator());
                menu.add(new JMenuItem("item 3"));
                menu.add(new JMenuItem("item 4"));
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setSize(200, 200);
                frame.add(menu);
                frame.add(button);
                button.addMouseListener(new Listener());
                frame.setVisible(true);
            }
        });
    }
}
--- End of source ---

It is regression.

Comments
SUGGESTED FIX +++ BasicPopupMenuUI.java Tue May 2 12:31:48 2006 @@ -786,12 +786,17 @@ } break; case MouseEvent.MOUSE_DRAGGED: src = (Component)ev.getSource(); if(!(src instanceof MenuElement)) { - // Do not forward event to MSM, let component handle it - break; + // For the MOUSE_DRAGGED event the src is + // the Component in which mouse button was pressed. + // If the src is in popupMenu, + // do not forward event to MSM, let component handle it. + if (isInPopup(src)) { + break; + } } MenuSelectionManager.defaultManager(). processMouseEvent((MouseEvent)ev); break; case MouseEvent.MOUSE_WHEEL:
04-05-2006

EVALUATION I tried Oleg's assumption and found that the cause really is in the fix for the 5036146. Now BasicPopupMenuUI.MouseGrabber.eventDispatched() does not forward mouse events to the MenuSelectionManager if their sourse in not a MenuElement. In the test case the source is Button.
25-04-2006

EVALUATION I believe this is a regression from fix for 5036146 (REGRESSION: problems with 1.5.0 action listeners). After this fix swing the MouseGrabber does not forward mouse events to the MenuSelectionManager if their sourse in not a MenuElement. But in the case from the test, the source is the component on which we pressed mouse (button)
19-04-2006