Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I convert an Icon to an Image

I'm trying to convert an Icon (javax.swing.Icon) to an Image (java.awt.Image) using this code:

private Image iconToImage(Icon icon) {     if(icon instanceof ImageIcon)     {         return ((ImageIcon) icon).getImage();     }     else     {         BufferedImage image = new BufferedImage(icon.getIconWidth(), icon.getIconHeight(), BufferedImage.TYPE_INT_RGB);         icon.paintIcon(null, image.getGraphics(), 0, 0);         return image;     } } 

The thing is, the paintIcon function throws a NullPointerException on the image.getGraphics().

For the record, the icon value is the default CheckBox icon (obtained via UIManager.getIcon("CheckBox.icon"))

Here are the details of the exception thrown :

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException     at com.sun.java.swing.plaf.windows.WindowsIconFactory$CheckBoxIcon.paintIcon(WindowsIconFactory.java:306)     at utils.WarningRenderer.iconToImage(WarningRenderer.java:50)     at utils.WarningRenderer.<init>(WarningRenderer.java:38)     at deliveryexpress.DeliveryExpressView.setWarnings(DeliveryExpressView.java:278)     at deliveryexpress.DeliveryExpressView.updateLists(DeliveryExpressView.java:218)     at deliveryexpress.DeliveryExpressView.access$1100(DeliveryExpressView.java:47)     at deliveryexpress.DeliveryExpressView$5.addCheck(DeliveryExpressView.java:183)     at org.japura.gui.model.DefaultListCheckModel.fireCheckListModelListeners(Unknown Source)     at org.japura.gui.model.DefaultListCheckModel.fireAddCheckListModelListeners(Unknown Source)     at org.japura.gui.model.DefaultListCheckModel.addCheck(Unknown Source)     at org.japura.gui.CheckList$1.mouseClicked(Unknown Source)     at java.awt.AWTEventMulticaster.mouseClicked(AWTEventMulticaster.java:253)     at java.awt.Component.processMouseEvent(Component.java:6292)     at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)     at java.awt.Component.processEvent(Component.java:6054)     at java.awt.Container.processEvent(Container.java:2041)     at java.awt.Component.dispatchEventImpl(Component.java:4652)     at java.awt.Container.dispatchEventImpl(Container.java:2099)     at java.awt.Component.dispatchEvent(Component.java:4482)     at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4577)     at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4247)     at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)     at java.awt.Container.dispatchEventImpl(Container.java:2085)     at java.awt.Window.dispatchEventImpl(Window.java:2478)     at java.awt.Component.dispatchEvent(Component.java:4482)     at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:644)     at java.awt.EventQueue.access$000(EventQueue.java:85)     at java.awt.EventQueue$1.run(EventQueue.java:603)     at java.awt.EventQueue$1.run(EventQueue.java:601)     at java.security.AccessController.doPrivileged(Native Method)     at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)     at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:98)     at java.awt.EventQueue$2.run(EventQueue.java:617)     at java.awt.EventQueue$2.run(EventQueue.java:615)     at java.security.AccessController.doPrivileged(Native Method)     at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)     at java.awt.EventQueue.dispatchEvent(EventQueue.java:614)     at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)     at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)     at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)     at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)     at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)     at java.awt.EventDispatchThread.run(EventDispatchThread.java:122) 

If you need more details, just tell me, I'll edit my post to add them.

Thanks!

like image 349
3rgo Avatar asked Apr 29 '11 09:04

3rgo


People also ask

How do I make a picture an icon file?

Go to menu Image > New Device Image, or right-click in the Image Editor pane and choose New Device Image. Select the type of image you want to add. You can also select Custom to create an icon whose size isn't available in the default list.

Is an ICO a PNG?

No. An ICO is actually a specialized file format that contains a collection of images at potentially many different sizes and color depths. A png is a specific image.


1 Answers

Just found a code snippet which might help if you want to wrap those misbehaving LAF provided icons more often:

/**  * Some ui-icons misbehave in that they unconditionally class-cast to the   * component type they are mostly painted on. Consequently they blow up if   * we are trying to paint them anywhere else (f.i. in a renderer).    *   * This Icon is an adaption of a cool trick by Darryl Burke/Rob Camick found at  * http://tips4java.wordpress.com/2008/12/18/icon-table-cell-renderer/#comment-120  *   * The base idea is to instantiate a component of the type expected by the icon,   * let it paint into the graphics of a bufferedImage and create an ImageIcon from it.  * In subsequent calls the ImageIcon is used.   *   */ public static class SafeIcon implements Icon {      private Icon wrappee;     private Icon standIn;      public SafeIcon(Icon wrappee) {         this.wrappee = wrappee;     }      @Override     public int getIconHeight() {         return wrappee.getIconHeight();     }      @Override     public int getIconWidth() {         return wrappee.getIconWidth();     }      @Override     public void paintIcon(Component c, Graphics g, int x, int y) {         if (standIn == this) {             paintFallback(c, g, x, y);         } else if (standIn != null) {             standIn.paintIcon(c, g, x, y);         } else {             try {                wrappee.paintIcon(c, g, x, y);              } catch (ClassCastException e) {                 createStandIn(e, x, y);                 standIn.paintIcon(c, g, x, y);             }         }     }      /**      * @param e      */     private void createStandIn(ClassCastException e, int x, int y) {         try {             Class<?> clazz = getClass(e);             JComponent standInComponent = getSubstitute(clazz);             standIn = createImageIcon(standInComponent, x, y);         } catch (Exception e1) {             // something went wrong - fallback to this painting             standIn = this;         }      }      private Icon createImageIcon(JComponent standInComponent, int x, int y) {         BufferedImage image = new BufferedImage(getIconWidth(),                 getIconHeight(), BufferedImage.TYPE_INT_ARGB);           Graphics g = image.createGraphics();           try {               wrappee.paintIcon(standInComponent, g, 0, 0);               return new ImageIcon(image);           } finally {               g.dispose();           }     }      /**      * @param clazz      * @throws IllegalAccessException       */     private JComponent getSubstitute(Class<?> clazz) throws IllegalAccessException {         JComponent standInComponent;         try {             standInComponent = (JComponent) clazz.newInstance();         } catch (InstantiationException e) {             standInComponent = new AbstractButton() {              };             ((AbstractButton) standInComponent).setModel(new DefaultButtonModel());         }          return standInComponent;     }      private Class<?> getClass(ClassCastException e) throws ClassNotFoundException {         String className = e.getMessage();         className = className.substring(className.lastIndexOf(" ") + 1);         return Class.forName(className);      }      private void paintFallback(Component c, Graphics g, int x, int y) {         g.drawRect(x, y, getIconWidth(), getIconHeight());         g.drawLine(x, y, x + getIconWidth(), y + getIconHeight());         g.drawLine(x + getIconWidth(), y, x, y + getIconHeight());     }  } 

To use in your snippet, simply pass in an arbitrary component:

    icon = new SafeIcon(icon);     BufferedImage image = new BufferedImage(icon.getIconWidth(), icon.getIconHeight(), BufferedImage.TYPE_INT_RGB);     icon.paintIcon(new JPanel(), image.getGraphics(), 0, 0); 
like image 117
kleopatra Avatar answered Sep 16 '22 16:09

kleopatra