# HG changeset patch # User bagiras # Date 1385467069 -14400 # Node ID 3a7def8aa5fb7abd6839f35ec0f7e21d6eb458f2 # Parent 561ed508292b38eeeb4a2326aff5fe515d4eae10 7160604: Using non-opaque windows - popups are initially not painted correctly Reviewed-by: serb, alexsch diff -r 561ed508292b -r 3a7def8aa5fb jdk/src/share/classes/javax/swing/JPopupMenu.java --- a/jdk/src/share/classes/javax/swing/JPopupMenu.java Tue Nov 26 13:30:44 2013 +0400 +++ b/jdk/src/share/classes/javax/swing/JPopupMenu.java Tue Nov 26 15:57:49 2013 +0400 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2013, 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 @@ -736,7 +736,7 @@ if (pref == null || pref.width != getWidth() || pref.height != getHeight()) { - popup = getPopup(); + showPopup(); } else { validate(); } @@ -787,7 +787,7 @@ if(b) { firePopupMenuWillBecomeVisible(); - popup = getPopup(); + showPopup(); firePropertyChange("visible", Boolean.FALSE, Boolean.TRUE); @@ -805,7 +805,7 @@ } /** - * Returns a Popup instance from the + * Retrieves Popup instance from the * PopupMenuUI that has had show invoked on * it. If the current popup is non-null, * this will invoke dispose of it, and then @@ -814,7 +814,7 @@ * This does NOT fire any events, it is up the caller to dispatch * the necessary events. */ - private Popup getPopup() { + private void showPopup() { Popup oldPopup = popup; if (oldPopup != null) { @@ -838,8 +838,8 @@ desiredLocationY); popupFactory.setPopupType(PopupFactory.LIGHT_WEIGHT_POPUP); + popup = newPopup; newPopup.show(); - return newPopup; } /** @@ -873,7 +873,7 @@ desiredLocationX = x; desiredLocationY = y; if(popup != null && (x != oldX || y != oldY)) { - popup = getPopup(); + showPopup(); } } @@ -1030,7 +1030,7 @@ Dimension newSize = getPreferredSize(); if (!oldSize.equals(newSize)) { - popup = getPopup(); + showPopup(); } } } diff -r 561ed508292b -r 3a7def8aa5fb jdk/test/javax/swing/JPopupMenu/7160604/bug7160604.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/swing/JPopupMenu/7160604/bug7160604.html Tue Nov 26 15:57:49 2013 +0400 @@ -0,0 +1,30 @@ + + + + + +Click on the top-bar and combo-box more than once. +Make sure popup menu and drop-down list have a border and their items are drawn properly. + + diff -r 561ed508292b -r 3a7def8aa5fb jdk/test/javax/swing/JPopupMenu/7160604/bug7160604.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/swing/JPopupMenu/7160604/bug7160604.java Tue Nov 26 15:57:49 2013 +0400 @@ -0,0 +1,87 @@ +/* + * Copyright (c) 2013, 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 + @bug 7160604 + @summary Using non-opaque windows - popups are initially not painted correctly + @author Oleg Pekhovskiy + @run applet/manual=yesno bug7160604.html +*/ + +import javax.swing.AbstractAction; +import javax.swing.BorderFactory; +import javax.swing.JApplet; +import javax.swing.JComboBox; +import javax.swing.JLabel; +import javax.swing.JMenuItem; +import javax.swing.JPanel; +import javax.swing.JPopupMenu; +import javax.swing.JWindow; +import javax.swing.SwingUtilities; +import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.event.ActionEvent; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; + +public class bug7160604 extends JApplet { + + public void init() { + SwingUtilities.invokeLater(() -> { + final JWindow window = new JWindow(); + window.setLocation(200, 200); + window.setSize(300, 300); + + final JLabel label = new JLabel("...click to invoke JPopupMenu"); + label.setOpaque(true); + final JPanel contentPane = new JPanel(new BorderLayout()); + contentPane.setBorder(BorderFactory.createLineBorder(Color.RED)); + window.setContentPane(contentPane); + contentPane.add(label, BorderLayout.NORTH); + + final JComboBox comboBox = new JComboBox(new Object[]{"1", "2", "3", "4"}); + contentPane.add(comboBox, BorderLayout.SOUTH); + + final JPopupMenu jPopupMenu = new JPopupMenu(); + + jPopupMenu.add("string"); + jPopupMenu.add(new AbstractAction("action") { + @Override + public void actionPerformed(final ActionEvent e) { + } + }); + jPopupMenu.add(new JLabel("label")); + jPopupMenu.add(new JMenuItem("MenuItem")); + label.addMouseListener(new MouseAdapter() { + @Override + public void mouseReleased(final MouseEvent e) { + jPopupMenu.show(label, 0, 0); + } + }); + + window.setBackground(new Color(0, 0, 0, 0)); + + window.setVisible(true); + }); + } +}