import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import javax.swing.*;

public class IconTest extends JPanel {

    private final static int SZ = 50;
    private final static Color C1X = Color.RED, C2X = Color.BLUE;

    private static BufferedImage generateImage(int scale, Color c) {

        int x = SZ * scale;
        BufferedImage img = new BufferedImage(x, x, BufferedImage.TYPE_INT_RGB);
        Graphics g = img.getGraphics();
        g.setColor(c);
        g.fillRect(0, 0, x, x);
        return img;
    }

    private static BaseMultiResolutionImage createIcon() {

        return new BaseMultiResolutionImage(new BufferedImage[] {
            generateImage(1, C1X), generateImage(2, C2X)});
    }

    private JFrame     frame;
    private JPopupMenu popup;
    private JMenuItem  popupItem;
    private JMenu      menu;

    public IconTest() throws Exception { SwingUtilities.invokeAndWait(this::UI); }

    private void UI() {

        ImageIcon ii = new ImageIcon(createIcon());

        popup = new JPopupMenu();
        popupItem = new JMenuItem("test", ii);
        popup.add(popupItem);
        popupItem.setHorizontalTextPosition(JMenuItem.RIGHT);
        addMouseListener(new MousePopupListener());

        frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JMenuBar menuBar = new JMenuBar();
        menu = new JMenu("test");
        menuBar.add(menu);
        menu.add(new JMenuItem("test", ii));
        menu.add(new JRadioButtonMenuItem("test", ii, true));
        menu.add(new JCheckBoxMenuItem("test", ii, true));

        frame.setJMenuBar(menuBar);
        frame.setContentPane(this);
        frame.setSize(300, 300);
        frame.setVisible(true);
    }

    private class MousePopupListener extends MouseAdapter {

        @Override
        public void mousePressed(MouseEvent e)  { showPopup(e); }
        @Override
        public void mouseClicked(MouseEvent e)  { showPopup(e); }
        @Override
        public void mouseReleased(MouseEvent e) { showPopup(e); }

        private void showPopup(MouseEvent e) {
            if (e.isPopupTrigger()) {
                popup.show(IconTest.this, e.getX(), e.getY());
            }
        }
    }

    public static void main(String s[]) throws Exception {

        //System.setProperty("sun.java2d.uiScale", "2");
        new IconTest();
    }
}
