Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-8173739

JPopupMenu does not disappear on KeyEvent

    XMLWordPrintable

Details

    • b23
    • x86
    • other

    Description

      FULL PRODUCT VERSION :
      1.8.0_121

      ADDITIONAL OS VERSION INFORMATION :
      Windows 10

      A DESCRIPTION OF THE PROBLEM :
      JPopupMenu does not get dismissed on KeyEvent in parent JInternalFrame resulting in popup appearing on a wrong window.

      STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
      1. Run the given source code.
      2. Right click on "Test Label"
      3. Press Ctrl+U


      EXPECTED VERSUS ACTUAL BEHAVIOR :
      EXPECTED -
      Popup should get dismissed as parent window loose focus
      ACTUAL -
      Popup menu is shown over a wrong internal frame

      REPRODUCIBILITY :
      This bug can be reproduced always.

      ---------- BEGIN SOURCE ----------
      import java.awt.Color;
      import java.awt.Dimension;
      import java.awt.GridBagConstraints;
      import java.awt.GridBagLayout;
      import java.awt.Insets;
      import java.awt.event.KeyEvent;
      import java.beans.PropertyVetoException;

      import javax.swing.JComponent;
      import javax.swing.JDesktopPane;
      import javax.swing.JFrame;
      import javax.swing.JInternalFrame;
      import javax.swing.JLabel;
      import javax.swing.JMenuItem;
      import javax.swing.JPanel;
      import javax.swing.JPopupMenu;
      import javax.swing.JScrollPane;
      import javax.swing.KeyStroke;
      import javax.swing.SwingUtilities;

      public class Main {

      public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
      public void run() {
      try {
      createAndShowUI();
      } catch (PropertyVetoException e) {
      e.printStackTrace();
      }
      }
      });
      }

      private static void createAndShowUI() throws PropertyVetoException {
      JFrame frame = new JFrame();
      frame.setTitle("Test Frame");
      frame.setSize(800, 600);

      JDesktopPane pane = new JDesktopPane();
      TestInternalFrameWPopup testInternalFrame1 = new TestInternalFrameWPopup();
      pane.add(testInternalFrame1);

      testInternalFrame1.setVisible(true);
      JScrollPane scrollPane = new JScrollPane(pane);
      frame.getContentPane().add(scrollPane);
      testInternalFrame1.setMaximum(true);
      frame.getRootPane().registerKeyboardAction(e -> {
      TestInternalFrame testInternalFrame2 = new TestInternalFrame();
      pane.add(testInternalFrame2);
      try {
      testInternalFrame2.setMaximum(true);
      } catch (PropertyVetoException e1) {
      // TODO Auto-generated catch block
      e1.printStackTrace();
      }
      testInternalFrame2.setVisible(true);

      }, KeyStroke.getKeyStroke(KeyEvent.VK_U, KeyEvent.CTRL_MASK), JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
      frame.setVisible(true);
      }

      }

      /**
       * Background color Cyan
       */
      class TestInternalFrameWPopup extends JInternalFrame {

      TestInternalFrameWPopup() {
      jbInit();
      }

      private void jbInit() {
      setTitle("Test Internal Frame With Popup");
      setContentPane(getContainerPanel());
      setMaximizable(true);
      setClosable(true);
      setMinimumSize(new Dimension(500, 300));
      setSize(500, 300);
      }

      private JPanel getContainerPanel() {
      JPanel panel = new JPanel();
      panel.setLayout(new GridBagLayout());
      JLabel label = new JLabel("Test Label");
      JPopupMenu popup = new JPopupMenu();
      JMenuItem menuItem1 = new JMenuItem("Item 1");
      JMenuItem menuItem2 = new JMenuItem("Item 2");
      JMenuItem menuItem3 = new JMenuItem("Item 3");
      JMenuItem menuItem4 = new JMenuItem("Item 4");
      JMenuItem menuItem5 = new JMenuItem("Item 5");
      menuItem1.setOpaque(false);
      menuItem2.setOpaque(false);
      menuItem3.setOpaque(false);
      menuItem4.setOpaque(false);
      menuItem5.setOpaque(false);
      popup.add(menuItem1);
      popup.add(menuItem2);
      popup.add(menuItem3);
      popup.add(menuItem4);
      popup.add(menuItem5);
      label.setComponentPopupMenu(popup);
      popup.setBackground(Color.CYAN);
      panel.add(label, new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0, GridBagConstraints.CENTER,
      GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0));
      panel.setBackground(Color.CYAN);
      return panel;
      }
      }

      /**
       * Background color Gray
       *
       */
      class TestInternalFrame extends JInternalFrame {
      public TestInternalFrame() {
      jbInit();
      }

      private void jbInit() {
      setTitle("Test Internal Frame");
      getContentPane().setBackground(Color.GRAY);
      setMaximizable(true);
      setClosable(true);
      setMinimumSize(new Dimension(500, 300));
      setSize(500, 300);
      }
      }

      ---------- END SOURCE ----------

      SUPPORT :
      YES

      Attachments

        Issue Links

          Activity

            People

              psadhukhan Prasanta Sadhukhan
              webbuggrp Webbug Group
              Votes:
              0 Vote for this issue
              Watchers:
              6 Start watching this issue

              Dates

                Created:
                Updated:
                Resolved: