Я хотел бы визуализировать компонент Java Swing, например JButton, который я также помещаю в JFrame, в BufferedImage. В целом это работает, но с основным недостатком: сглаживание текста, особенно режим сглаживания «LCD», не работает при рендеринге в BufferedImage.
Я собрал несколько примеров кода, чтобы продемонстрировать проблему, но сначала моя системная информация:
- ОС : Windows 7, 64-битная
- JVM : 1.6.0_26-b03 (32 бита)
Следующий пример кода создаст простой JFrame, поместит в него JButton и затем отобразит JButton в файл "test.png":
public class TextAntiAliasingTest
{
public TextAntiAliasingTest() throws IOException
{
// Create Test-Button which will be rendered to an image
JButton button = new JButton( "The Test-Button" );
button.setSize( 200, 70 );
button.setLocation( 200, 150 );
// Create JFrame
final JFrame frame = new JFrame();
frame.setSize( 800, 600 );
frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
frame.setLayout( null );
frame.setLocationRelativeTo( null );
frame.add( button );
// Show JFrame
SwingUtilities.invokeLater( new Runnable() {
@Override public void run() {
frame.setVisible( true );
}
});
// Render JButton to an BufferedImage
BufferedImage image = new BufferedImage( 800, 600, BufferedImage.TYPE_INT_ARGB );
Graphics2D g2d = (Graphics2D)image.getGraphics();
button.paint( g2d );
// Write BufferedImage to a PNG file
ImageIO.write( image, "PNG", new File( "test.png" ) );
}
public static void main( String[] args ) throws Exception
{
UIManager.setLookAndFeel( "com.sun.java.swing.plaf.windows.WindowsLookAndFeel" );
System.setProperty( "awt.useSystemAAFontSettings", "lcd" );
new TextAntiAliasingTest();
}
}
На следующем изображении показана разница между JButton в JFrame на экране и тем же визуализированным JButton в файле изображения:
На самом деле на изображении присутствует некоторое сглаживание текста, но не оптимизированное сглаживание на ЖК-дисплее, которое отображается на экране в JFrame (эта проблема возникает также при использовании LookAndFeel по умолчанию, а не только с WindowsLookAndFeel).
Я уже пытался явно установить RenderingHint для сглаживания текста в «g2d», контекст Graphics2D объекта BufferedImage выглядит так:
g2d.setRenderingHint( RenderingHints.KEY_TEXT_ANTIALIASING,
RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HRGB );
Но это никак не повлияло.
Мне срочно нужно отобразить JButton в файл изображения, как будто он отображается на экране (это всего лишь пример, на самом деле мне нужно отобразить некоторые более сложные компоненты, которые все страдают от этой проблемы сглаживания), и я надеюсь, что там это реальное решение без какого-либо неприятного обходного пути, например, снимок экрана или что-то в этом роде.
Я очень ценю любую помощь - большое спасибо!