On Jan 24, 2014, at 14:31, Sergey Bylokhov <sergey.bylok...@oracle.com> wrote:
> You can draw the component to the VolatileImage. or you can create double > size bufferedimage and set scale on its graphics to 2. Drawing to a VolatileImage created via GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice() .getDefaultConfiguration().createCompatibleVolatileImage(100, 100); seems to do the trick. However, your other suggestion (double size bufferedimage), does not work. Is this intended or a bug? Thanks! -hendrik Here's a simple demo class. I'd expect both checkboxes to render in the same quality, but they don't using a BufferedImage. import javax.swing.*; import java.awt.*; import java.awt.image.BufferedImage; public class RenderHiDPI { public static void main(String[] args) { final JFrame frame = new JFrame(); final JLabel label = new JLabel(); frame.getContentPane().setLayout(new FlowLayout()); final JCheckBox hiDPICheckBox = new JCheckBox("Hi DPI"); hiDPICheckBox.setFocusable(false); frame.getContentPane().add(hiDPICheckBox); frame.getContentPane().add(label); final JCheckBox checkBox = new JCheckBox("Lo DPI"); checkBox.setSize(new Dimension(100, 100)); final BufferedImage image = new BufferedImage(200, 200, BufferedImage.TYPE_INT_ARGB); final Graphics g = image.getGraphics(); ((Graphics2D)g).scale(2f, 2f); checkBox.paint(g); g.dispose(); label.setIcon(new Icon(){ @Override public void paintIcon(final Component c, final Graphics g, final int x, final int y) { final Graphics2D graphics = (Graphics2D)g.create(); graphics.scale(0.5f, 0.5f); graphics.drawImage(image, x, y, c); } @Override public int getIconWidth() { return 100; } @Override public int getIconHeight() { return 100; } }); SwingUtilities.invokeLater(new Runnable() { @Override public void run() { frame.setBounds(100, 100, 100, 100); frame.setVisible(true); } }); } }