-
Bug
-
Resolution: Fixed
-
P4
-
8, 9
-
b23
-
x86
-
other
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
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
- relates to
-
JDK-8274931 Ungrab event sent by JInternalFrame causes cancelation of JComboBox menu
-
- Closed
-