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