<Swing Dev> Issue with setComponentPopupMenu

classic Classic list List threaded Threaded
3 messages Options
Reply | Threaded
Open this post in threaded view
|

<Swing Dev> Issue with setComponentPopupMenu

Van Den Borre, Koen
Hey,

I am seeing an issue when using setComponentPopupMenu.

When you use setComponentPopupMenu in a window and create a modeless dialog and position that over that window. A contextual menu click in the modeless dialog will show the contextual men of the component in the parent window.

I traced the issue down to processMouseEvent in the Container class. There, a call is made to trackMouseEnterExit which will create and dispatch a MouseEvent.MOUSE_ENTERED mouse event.

This generated mouse event still has the isPopupTrigger attribute set to true which will then triggers the componentPopupMenu to be shown.

As always an example says more that a thousand words:

import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenuItem;
import javax.swing.JPopupMenu;
import javax.swing.SwingUtilities;

public class ComponentPopupMenuTest {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
test();
}
});
}

private static void test() {
JPopupMenu popupMenu = new JPopupMenu();
popupMenu.add(new JMenuItem("You should not see me"));

JFrame frame = new JFrame("Main Frame");
frame.getRootPane().setComponentPopupMenu(popupMenu);
frame.setSize(400, 400);
frame.setLocation(0, 0);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);

JDialog dialog = new JDialog(frame, "Modeless Dialog", false);
dialog.getContentPane().add(new JLabel("Do a contextual mouse click here"));
dialog.setSize(300, 300);
dialog.setLocation(50, 50);
dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
dialog.setVisible(true);
}
}


Please be advised that this email may contain confidential information. If you are not the intended recipient, please notify us by email by replying to the sender and delete this message. The sender disclaims that the content of this email constitutes an offer to enter into, or the acceptance of, any agreement; provided that the foregoing does not invalidate the binding effect of any digital or other electronic reproduction of a manual signature that is included in any attachment.
Reply | Threaded
Open this post in threaded view
|

Re: <Swing Dev> Issue with setComponentPopupMenu

Van Den Borre, Koen
I forgot to mention that I see this behavior on macOS Sierra 10.12.6 (16G29) 

java version "1.8.0_152-ea"
Java(TM) SE Runtime Environment (build 1.8.0_152-ea-b05)
Java HotSpot(TM) 64-Bit Server VM (build 25.152-b05, mixed mode)

On 5 Oct 2017, at 12:32, Van Den Borre, Koen <[hidden email]> wrote:

Hey,

I am seeing an issue when using setComponentPopupMenu.

When you use setComponentPopupMenu in a window and create a modeless dialog and position that over that window. A contextual menu click in the modeless dialog will show the contextual men of the component in the parent window.

I traced the issue down to processMouseEvent in the Container class. There, a call is made to trackMouseEnterExit which will create and dispatch a MouseEvent.MOUSE_ENTERED mouse event.

This generated mouse event still has the isPopupTrigger attribute set to true which will then triggers the componentPopupMenu to be shown.

As always an example says more that a thousand words:

import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenuItem;
import javax.swing.JPopupMenu;
import javax.swing.SwingUtilities;

public class ComponentPopupMenuTest {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
test();
}
});
}

private static void test() {
JPopupMenu popupMenu = new JPopupMenu();
popupMenu.add(new JMenuItem("You should not see me"));

JFrame frame = new JFrame("Main Frame");
frame.getRootPane().setComponentPopupMenu(popupMenu);
frame.setSize(400, 400);
frame.setLocation(0, 0);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);

JDialog dialog = new JDialog(frame, "Modeless Dialog", false);
dialog.getContentPane().add(new JLabel("Do a contextual mouse click here"));
dialog.setSize(300, 300);
dialog.setLocation(50, 50);
dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
dialog.setVisible(true);
}
}


Please be advised that this email may contain confidential information. If you are not the intended recipient, please notify us by email by replying to the sender and delete this message. The sender disclaims that the content of this email constitutes an offer to enter into, or the acceptance of, any agreement; provided that the foregoing does not invalidate the binding effect of any digital or other electronic reproduction of a manual signature that is included in any attachment.

Please be advised that this email may contain confidential information. If you are not the intended recipient, please notify us by email by replying to the sender and delete this message. The sender disclaims that the content of this email constitutes an offer to enter into, or the acceptance of, any agreement; provided that the foregoing does not invalidate the binding effect of any digital or other electronic reproduction of a manual signature that is included in any attachment.
Reply | Threaded
Open this post in threaded view
|

Re: <Swing Dev> Issue with setComponentPopupMenu

Sergey Bylokhov
Hello.
Thank you for the report. Could you please create CR for this bug here:
http://bugreport.java.com/bugreport


On 10/5/17 03:35, Van Den Borre, Koen wrote:

> I forgot to mention that I see this behavior on macOS Sierra 10.12.6
> (16G29)
>
> java version "1.8.0_152-ea"
> Java(TM) SE Runtime Environment (build 1.8.0_152-ea-b05)
> Java HotSpot(TM) 64-Bit Server VM (build 25.152-b05, mixed mode)
>
>> On 5 Oct 2017, at 12:32, Van Den Borre, Koen
>> <[hidden email] <mailto:[hidden email]>> wrote:
>>
>> Hey,
>>
>> I am seeing an issue when using setComponentPopupMenu.
>>
>> When you use setComponentPopupMenu in a window and create a modeless
>> dialog and position that over that window. A contextual menu click in
>> the modeless dialog will show the contextual men of the component in
>> the parent window.
>>
>> I traced the issue down to processMouseEvent in the Container class.
>> There, a call is made to trackMouseEnterExit which will create and
>> dispatch a MouseEvent.MOUSE_ENTERED mouse event.
>>
>> This generated mouse event still has the isPopupTrigger attribute set
>> to true which will then triggers the componentPopupMenu to be shown.
>>
>> As always an example says more that a thousand words:
>>
>> import javax.swing.JDialog;
>> import javax.swing.JFrame;
>> import javax.swing.JLabel;
>> import javax.swing.JMenuItem;
>> import javax.swing.JPopupMenu;
>> import javax.swing.SwingUtilities;
>>
>> public class ComponentPopupMenuTest {
>> public static void main(String[] args) {
>> SwingUtilities.invokeLater(new Runnable() {
>> @Override
>> public void run() {
>> test();
>> }
>> });
>> }
>>
>> private static void test() {
>> JPopupMenu popupMenu = new JPopupMenu();
>> popupMenu.add(new JMenuItem("You should not see me"));
>>
>> JFrame frame = new JFrame("Main Frame");
>> frame.getRootPane().setComponentPopupMenu(popupMenu);
>> frame.setSize(400, 400);
>> frame.setLocation(0, 0);
>> frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
>> frame.setVisible(true);
>>
>> JDialog dialog = new JDialog(frame, "Modeless Dialog", false);
>> dialog.getContentPane().add(new JLabel("Do a contextual mouse click
>> here"));
>> dialog.setSize(300, 300);
>> dialog.setLocation(50, 50);
>> dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
>> dialog.setVisible(true);
>> }
>> }
>>
>>
>> Please be advised that this email may contain confidential
>> information. If you are not the intended recipient, please notify us
>> by email by replying to the sender and delete this message. The sender
>> disclaims that the content of this email constitutes an offer to enter
>> into, or the acceptance of, any agreement; provided that the foregoing
>> does not invalidate the binding effect of any digital or other
>> electronic reproduction of a manual signature that is included in any
>> attachment.
>
> Please be advised that this email may contain confidential information.
> If you are not the intended recipient, please notify us by email by
> replying to the sender and delete this message. The sender disclaims
> that the content of this email constitutes an offer to enter into, or
> the acceptance of, any agreement; provided that the foregoing does not
> invalidate the binding effect of any digital or other electronic
> reproduction of a manual signature that is included in any attachment.


--
Best regards, Sergey.