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!
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.
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.
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);
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With