как заставить JTextPane рисовать шрифт со сглаживанием?

в приложении Swing я отображаю текст с пользовательским JComponent, используя Graphics.drawString(). вот пример:
http://img525.imageshack.us/img525/4928/drawstringsample.jpg
в том же приложении я визуализирую текст, используя JTextPane. вот пример:
http://img28.imageshack.us/img28/1134/jtextpanesample.jpg

вы заметили, что нижний образец немного «размазан»? ну, я не могу понять, как сделать его похожим на верхний образец.

спасибо, Асаф :-)


Обновить:

  • System.setProperty("awt.useSystemAAFontSettings","false") и "lcd" тоже не работают.
  • ((Graphics2D)g).setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_OFF) в paint() не работает
  • putClientProperty(sun.swing.SwingUtilities2.AA_TEXT_PROPERTY_KEY, Boolean.TRUE) дает java.lang.ClassCastException: java.lang.Boolean cannot be cast to sun.swing.SwingUtilities2$AATextInfo

person Asaf    schedule 15.02.2010    source источник


Ответы (3)


Это приведет к сглаженному шрифту в JLabel. Убедитесь, что вы вызываете super.paintComponent(g); после установки RenderingHints.

JLabel lblFont = new JLabel(){

            @Override
            public void paintComponent(Graphics g) {
                Graphics2D graphics2d = (Graphics2D) g;
                graphics2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                        RenderingHints.VALUE_ANTIALIAS_ON);
                super.paintComponent(g);
            }
        };
person Lukas Glowania    schedule 08.12.2010
comment
вы отвечаете, потому что вы попробовали это, и это решило вашу проблему? - person Asaf; 09.12.2010
comment
да, в моем случае я мог включать и выключать сглаживание с помощью этого подхода. - person Lukas Glowania; 17.03.2011
comment
@ b1tk0pf Сочетание вашего подхода со следующим кодом делает текст еще более плавным — jTextPane1.putClientProperty(SwingUtilities2.AA_TEXT_PROPERTY_KEY, null); - person Igor; 21.12.2012
comment
Я бы предпочел это решение, так как оно сглаживает текст при рисовании на любой графике (в моем случае BufferedImage), но putClientProperty будет лучше для приложений Swing. (Возможно, я до сих пор ненавижу идею использования пакетов sun.*) - person Jakub; 19.06.2013
comment
Он не работает с JTextPane, тогда как SwingUtilities2.AA_TEXT_PROPERTY_KEY работает. - person ron190; 07.06.2016

Если вы хотите, чтобы ваш результат выглядел как верхний образец, вам нужно отключить сглаживание.

В первом примере в вашем вопросе сглаживание отключено, а во втором — включено.

Согласно http://mindprod.com/jgloss/antialiasing.html, следующий код должен помочь :

jtextArea.putClientProperty(com.sun.java.swing.SwingUtilities2.AA_TEXT_PROPERTY_KEY, Boolean.TRUE);

Обратите внимание, что ссылка на com.sun.java.* сделает ваше приложение непереносимым на другие JVM, отличные от Sun (и, возможно, на другие версии Sun JVM).

person Joachim Sauer    schedule 15.02.2010
comment
пробовал System.setProperty(awt.useSystemAAFontSettings,false) и lcd тоже, но безрезультатно. - person Asaf; 15.02.2010
comment
попробовал ((Graphics2D)g).setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_OFF) в paint(), но без результатов. - person Asaf; 15.02.2010
comment
и putClientProperty(sun.swing.SwingUtilities2.AA_TEXT_PROPERTY_KEY, Boolean.TRUE) дает java.lang.ClassCastException: java.lang.Boolean не может быть приведен к sun.swing.SwingUtilities2$AATextInfo - person Asaf; 15.02.2010

person    schedule
comment
Если это фактическое решение, отметьте его как таковое (установив флажок «принятый ответ»), TIA! - person Rahel Lüthy; 16.02.2010
comment
Это не работает с java 9: ​​java.lang.NoSuchFieldException: AA_TEXT_PROPERTY_KEY. - person ron190; 07.06.2016