1 /*
   2  * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.
   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  */
  23 
  24 /**
  25  * @test
  26  * @key headful
  27  * @bug 8152981 8159135
  28  * @summary Double icons with JMenuItem setHorizontalTextPosition on Win 10
  29  * @requires (os.family == "windows")
  30  * @run main MenuItemIconTest
  31  */
  32 
  33 import java.awt.Color;
  34 import java.awt.Dimension;
  35 import java.awt.Graphics;
  36 import java.awt.Point;
  37 import java.awt.Robot;
  38 import java.awt.image.BufferedImage;
  39 import javax.swing.ImageIcon;
  40 import javax.swing.JFrame;
  41 import javax.swing.JMenuBar;
  42 import javax.swing.JMenuItem;
  43 import javax.swing.SwingConstants;
  44 import javax.swing.SwingUtilities;
  45 import javax.swing.UIManager;
  46 import javax.swing.UnsupportedLookAndFeelException;
  47 
  48 public class MenuItemIconTest {
  49 
  50     private static JFrame frame;
  51     private static Robot robot;
  52     private static String errorMessage = "";
  53     private static JMenuItem menuItem;
  54     private static final int IMAGE_WIDTH_AND_HEIGHT = 25;
  55 
  56     public static void main(String[] args) throws Exception {
  57         robot = new Robot();
  58         String name = UIManager.getSystemLookAndFeelClassName();
  59         try {
  60             UIManager.setLookAndFeel(name);
  61         } catch (ClassNotFoundException | InstantiationException |
  62                 IllegalAccessException | UnsupportedLookAndFeelException e) {
  63             throw new RuntimeException("Test Failed");
  64         }
  65         createUI();
  66         robot.waitForIdle();
  67         executeTest();
  68         if (!"".equals(errorMessage)) {
  69             throw new RuntimeException(errorMessage);
  70         }
  71     }
  72 
  73     private static void createUI() throws Exception {
  74         SwingUtilities.invokeAndWait(() -> {
  75             frame = new JFrame();
  76             frame.setTitle("Test");
  77             JMenuBar menuBar = new JMenuBar();
  78             ImageIcon icon = createIcon();
  79             menuItem = new JMenuItem("Command", icon);
  80             menuItem.setHorizontalTextPosition(SwingConstants.LEFT);
  81             menuBar.add(menuItem);
  82             frame.setJMenuBar(menuBar);
  83             frame.setPreferredSize(new Dimension(500, 500));
  84             frame.pack();
  85             frame.setVisible(true);
  86             frame.setLocationRelativeTo(null);
  87         });
  88     }
  89 
  90     private static void checkPixeclColor(int x, int y) {
  91         robot.delay(2000);
  92         robot.mouseMove(x, y);
  93         Color c = robot.getPixelColor(x, y);
  94         if (Color.RED.equals(c)) {
  95             errorMessage = "Test Failed";
  96         }
  97         robot.delay(5000);
  98         frame.dispose();
  99     }
 100 
 101     protected static ImageIcon createIcon() {
 102         BufferedImage bi = new BufferedImage(IMAGE_WIDTH_AND_HEIGHT,
 103                 IMAGE_WIDTH_AND_HEIGHT, BufferedImage.TYPE_INT_ARGB);
 104         Graphics g = bi.createGraphics();
 105         g.setColor(Color.RED);
 106         g.fillOval(0, 0, IMAGE_WIDTH_AND_HEIGHT, IMAGE_WIDTH_AND_HEIGHT);
 107         return new ImageIcon(bi);
 108     }
 109 
 110     private static void executeTest() throws Exception {
 111         Point point = menuItem.getLocationOnScreen();
 112         checkPixeclColor(point.x + IMAGE_WIDTH_AND_HEIGHT / 2,
 113                 point.y + IMAGE_WIDTH_AND_HEIGHT / 2);
 114     }
 115 }
 116