changeset 57346:f7923e6f8cbe

8234386: [macos] NPE was thrown at expanding Choice from maximized frame Reviewed-by: serb
author tnakamura
date Thu, 05 Dec 2019 15:36:08 -0800
parents 86c2c566da0a
children 0417b0fcf9d9
files src/java.desktop/share/classes/javax/swing/JPopupMenu.java test/jdk/java/awt/Choice/ChoiceFromMaximizedFrame/ChoiceFromMaximizedFrame.java
diffstat 2 files changed, 89 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/src/java.desktop/share/classes/javax/swing/JPopupMenu.java	Thu Dec 05 15:33:37 2019 -0800
+++ b/src/java.desktop/share/classes/javax/swing/JPopupMenu.java	Thu Dec 05 15:36:08 2019 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2019, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -325,16 +325,13 @@
         }
 
         // Get screen bounds
-        Rectangle scrBounds;
         GraphicsConfiguration gc = getCurrentGraphicsConfiguration(popupLocation);
-        Toolkit toolkit = Toolkit.getDefaultToolkit();
-        if(gc != null) {
-            // If we have GraphicsConfiguration use it to get screen bounds
-            scrBounds = gc.getBounds();
-        } else {
+        if (gc == null) {
             // If we don't have GraphicsConfiguration use primary screen
-            scrBounds = new Rectangle(toolkit.getScreenSize());
+            gc = GraphicsEnvironment.getLocalGraphicsEnvironment().
+                            getDefaultScreenDevice().getDefaultConfiguration();
         }
+        Rectangle scrBounds = gc.getBounds();
 
         // Calculate the screen size that popup should fit
         Dimension popupSize = JPopupMenu.this.getPreferredSize();
@@ -345,6 +342,7 @@
 
         if (!canPopupOverlapTaskBar()) {
             // Insets include the task bar. Take them into account.
+            Toolkit toolkit = Toolkit.getDefaultToolkit();
             Insets scrInsets = toolkit.getScreenInsets(gc);
             scrBounds.x += scrInsets.left;
             scrBounds.y += scrInsets.top;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/jdk/java/awt/Choice/ChoiceFromMaximizedFrame/ChoiceFromMaximizedFrame.java	Thu Dec 05 15:36:08 2019 -0800
@@ -0,0 +1,83 @@
+/*
+ * Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * @test
+ * @key headful
+ * @bug 8234386
+ * @requires (os.family == "mac")
+ * @summary [macos] NPE was thrown at expanding Choice from maximized frame
+ * @run main ChoiceFromMaximizedFrame
+ */
+
+import java.awt.BorderLayout;
+import java.awt.Canvas;
+import java.awt.Choice;
+import java.awt.Frame;
+import java.awt.GraphicsConfiguration;
+import java.awt.GraphicsEnvironment;
+import java.awt.Insets;
+import java.awt.Panel;
+import java.awt.Rectangle;
+import java.awt.Robot;
+import java.awt.Toolkit;
+import java.awt.event.KeyEvent;
+
+public class ChoiceFromMaximizedFrame
+{
+    static public void main(String args[]) throws Exception
+    {
+        Frame f = new Frame("ChoiceTest");
+        try {
+            Panel p =new Panel(new BorderLayout());
+            Choice choice = new Choice();
+            choice.addItem("aaa");
+            choice.addItem("bbb");
+            p.add("North",choice);
+            p.add("Center",new Canvas());
+            f.add(p);
+
+            GraphicsConfiguration gc = GraphicsEnvironment
+                .getLocalGraphicsEnvironment()
+                .getDefaultScreenDevice().getDefaultConfiguration();
+            Rectangle bounds = gc.getBounds();
+            Insets insets = Toolkit.getDefaultToolkit().getScreenInsets(gc);
+            int x = bounds.x + insets.left;
+            int y = bounds.y + insets.top;
+            int width = bounds.width - insets.left - insets.right;
+            int height = bounds.height - insets.top - insets.bottom;
+            Rectangle rect = new Rectangle(x, y, width, height);
+            f.pack();
+            f.setBounds(rect);
+            f.setVisible(true);
+
+            Robot robot = new Robot();
+            robot.waitForIdle();
+            robot.keyPress(KeyEvent.VK_SPACE);
+            robot.keyRelease(KeyEvent.VK_SPACE);
+            robot.delay(1000);
+        } finally {
+            f.dispose();
+        }
+    }
+}