<Swing Dev> [9] Review request for 8081411 Add an API for painting an icon with a SynthContext

Alexander Scherbatiy alexandr.scherbatiy at oracle.com
Thu Aug 6 08:29:05 UTC 2015


Hello,

Could you review the fix:
   bug: https://bugs.openjdk.java.net/browse/JDK-8081411
   webrev: http://cr.openjdk.java.net/~alexsch/8081411/webrev.00

  The following use case were considered:

1. An icon is taken from UIManager.getIcon(iconKey) and should be painted.
    Icon icon = UIManager.getIcon(iconKey);

    icon.paint(graphics, x, y) may not work for icons that are used by 
Synth L&F because the paint method with null synth context may just do 
nothing.

2. One icons is created based on existed icon.

   Foe example, creating a centered icon:
   ----------------------------
     Icon centeredIcon = new SynthIcon() {
         private final SynthIcon synthIcon = (SynthIcon)icon;
         public void paintIcon(SynthContext sc, Graphics grphcs, int x, 
int y, int w, int h) {
             try {
                 int dw = SynthIcon.getIconWidth(synthIcon, sc);
                 int dh = SynthIcon.getIconHeight(synthIcon, sc);
                 int dx = width - dw;
                 int dy = height - dh;
                 SynthIcon.paintIcon(synthIcon, sc, grphcs, x + dx/2, y 
+ dy/2, dw + 2, dh + 2);
             } catch (Throwable t) {
                 try { synthIcon.paintIcon(sc, grphcs, x, y, w, h); } 
catch (Throwable th) {}
             }
         }
         public int getIconWidth(SynthContext sc)  { return width;  }
         public int getIconHeight(SynthContext sc) { return height; }
     };
   ----------------------------

   Overriding just paintIcon(Component c, Graphics g, int x, int y) 
leads to the same issue. The icon may not be drawn in this case.

3. Replace an icon in UIManager to a custom icon which can use a synth 
context for painting:
    UIManager.putIcon(iconKey, new CustomIcon())

The case 1 requires that only the following static methods were public:
    SynthIcon.paintIcon(context, graphics, x, y, w, h)
    SynthIcon.getIconwidth(context)
    SynthIcon.getIconHeight(context)

The cases 2 and 3 need to work with SyntIcon class.

The proposed fix moves the paintIcon/getIconwidth/getIconHeight methods 
to the public SynthGraphicsUtils class
and make the SynthIcon class public by moving it to the 
javax.swing.plaf.synth package.

Thanks,
Alexandr.




More information about the swing-dev mailing list