JDK-8152981 : Double icons with JMenuItem setHorizontalTextPosition on Win 10
  • Type: Bug
  • Component: client-libs
  • Sub-Component: javax.swing
  • Affected Version: 8u66,9
  • Priority: P4
  • Status: Resolved
  • Resolution: Fixed
  • OS: windows_7,windows_10
  • CPU: x86_64
  • Submitted: 2016-02-16
  • Updated: 2020-03-04
  • Resolved: 2016-05-25
The Version table provides details related to the release that this issue/RFE will be addressed.

Unresolved : Release in which this issue/RFE will be addressed.
Resolved: Release in which this issue/RFE has been resolved.
Fixed : Release in which this issue/RFE has been fixed. The release containing this fix may be available for download as an Early Access Release or a General Availability Release.

To download the current JDK release, click here.
JDK 8 JDK 9
8u121Fixed 9 b124Fixed
Related Reports
Relates :  
Description
FULL PRODUCT VERSION :
java version "1.8.0_66"
Java(TM) SE Runtime Environment (build 1.8.0_66-b17)
Java HotSpot(TM) 64-Bit Server VM (build 25.66-b17, mixed mode)


ADDITIONAL OS VERSION INFORMATION :
Microsoft Windows [Version 10.0.10586]

A DESCRIPTION OF THE PROBLEM :
The icon appears twice, on the left AND the right when you change the default position in a JMenuItem using setHorizontalTextPosition() with Windows Look and Feel.

STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
See self contained test below. 

Or just create a JMenuItem with an icon and text, then change the default position of the icon using setHorizontalTextPosition(SwingConstants.LEFT)

EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
Can change the icon position in a JMenuItem using setHorizontalTextPosition() 
ACTUAL -
The icon appears twice, on the left and the right side of the JMenuItem

REPRODUCIBILITY :
This bug can be reproduced always.

---------- BEGIN SOURCE ----------
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.image.BufferedImage;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.SwingConstants;
import javax.swing.UIManager;


public class WinMenuItemIcon {

	public static void main(String[] args) {
		
		//NOTE: Bug happens with Windows L&F
        String name = UIManager.getSystemLookAndFeelClassName();
        try {
			UIManager.setLookAndFeel( name );
		} catch (Exception e) {
			e.printStackTrace();
		}

		JFrame frame = new JFrame();
		frame.setTitle("Test");
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		JMenuBar menuBar = new JMenuBar();
		JMenu menu = new JMenu("Menu");
		
		ImageIcon icon = createIcon();
		
		JMenuItem menuItem = new JMenuItem("Command", icon);
		menuItem.setHorizontalTextPosition(SwingConstants.LEFT);
		menu.add(menuItem);
		menuBar.add(menu);

		frame.setJMenuBar(menuBar);
		frame.setPreferredSize(new Dimension(500, 500));
		frame.pack();
		frame.setVisible(true);
	}
	
	protected static ImageIcon createIcon() {
		BufferedImage bi = new BufferedImage(25,25,BufferedImage.TYPE_INT_ARGB);
		Graphics g = bi.createGraphics();
		g.setColor(Color.RED);
		g.fillOval(0,0, 25, 25);
		return new ImageIcon(bi);
	}
	
}




---------- END SOURCE ----------

CUSTOMER SUBMITTED WORKAROUND :
Don't use Windows Look and Feel. Works fine with default Java look and feel.


Comments
Issue reproduces with JDK9, Win7. Icon is displayed twice on left and right of MenuItem text, refer attached screenshot. Issue occurs only If this call is present, menuItem.setHorizontalTextPosition(SwingConstants.LEFT)
12-04-2016

does it affect 9 ?
29-03-2016