Когда я запускаю свои приложения с графическим интерфейсом Swing под Java 6, они автоматически используют настроенные мной параметры субпиксельного сглаживания для всех шрифтов. Результат намного лучше стандартных опций AA.
Но когда я рисую изображение, я не могу найти способ инициализировать графический контекст для использования конфигурации системы AA. Попытки поиграть с различными подсказками Java для AA - безнадежное дело, потому что ни один субпиксельный метод не будет работать для всех пользователей.
Есть ли способ наследовать системные настройки AA для данного графического контекста вместо того, чтобы выбирать один и явно указывать подсказку? На данный момент мне приходится использовать GASP AA, чтобы избежать ужасных результатов, которые дает стандартный AA с мелкими шрифтами. Я пробовал ничего не устанавливать для текста AA и вообще не устанавливать никаких подсказок AA.
Обновление от 05 января 2010 г.
Думаю, я это зафиксировал; подсказки субпиксельного AA, по-видимому, соблюдаются только при рисовании непосредственно в графическом контексте AWT; когда я рисую изображение с двойным буфером, он просто выполняет стандартный AA; но когда я обхожу изображение с двойным буфером, субпиксельный AA выполняется.
В противном случае ответ The_Fire будет работать в JVM, в которых доступен Swing (но не J2ME JVM); Обратите внимание, что ответ The_Fire не работает с использованием компонента AWT (не удается использовать new Label () вместо new JLabel ()), предположительно потому, что FontRenderContext не может быть извлечен, пока компонент не будет реализован на дисплее.
Мой текущий код для получения графического контекста для моего целевого изображения в настоящее время выглядит так:
try {
if((dbImage=dctRoot.createImage(wid,hgt,1))!=null) { // if createImage returns null or throws an exception the component is not yet displayable
dbGraphics=(Graphics2D)dbImage.getGraphics();
if(dctRoot.properties.getBoolean("Antialias",true)) {
try {
// set AA on overall
dbGraphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING ,RenderingHints.VALUE_ANTIALIAS_ON);
// set text AA to platform/impl default
dbGraphics.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,RenderingHints.VALUE_TEXT_ANTIALIAS_DEFAULT);
// try to override platform/impl AA with font-specified AA (Java 6+)
try { dbGraphics.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,RenderingHints.class.getField("VALUE_TEXT_ANTIALIAS_GASP").get(null)); } catch(Throwable thr) {;} // yes, ignore exception
}
catch(Throwable thr) {
dctRoot.log.println("Antialiasing not supported on this JVM ("+thr+").");
dctRoot.setProperty("Antialias","False"); // turn off AA for subsequent painting
}
}
}
}
catch(Throwable thr) {
dbImage=null;
dbGraphics=null;
}
Код для создания изображения использует базовый компонент AWT, который формирует фон, на котором я рисую всю свою картину - компонент - это Panel, потому что мне нужно иметь возможность делать setFocusCycleRoot, чтобы он хорошо работал с другими компонентами AWT. Код создания изображения следующий:
public DctImage createImage(int wid, int hgt, float accpty) {
GraphicsConfiguration cfg=awtComponent.getGraphicsConfiguration();
Image img=null;
if(transparentImages) {
//y { img=new BufferedImage(wid,hgt,BufferedImage.TYPE_INT_ARGB); } // NB: J2ME CDC/PP 1.1 does not have the BufferedImage constructors (one day I may discover a way to create a BufferedImage via another API!!)
try { img=cfg.createCompatibleImage(wid,hgt,Transparency.TRANSLUCENT); }// NB: J2ME CDC/PP 1.1 does not have this API, but prefer to use GraphicsConfiguration over new BufferImage(...)
catch(NoClassDefFoundError thr) { transparentImages=false; createImage(wid,hgt,accpty); } // try again with transparency disabled
catch(NoSuchMethodError thr) { transparentImages=false; createImage(wid,hgt,accpty); } // try again with transparency disabled
catch(NoSuchFieldError thr) { transparentImages=false; createImage(wid,hgt,accpty); } // try again with transparency disabled
}
else {
img=cfg.createCompatibleImage(wid,hgt);
}
if(accpty>0 && SET_ACCELERATION_PRIORITY!=null) {
try { SET_ACCELERATION_PRIORITY.invoke(img,new Object[]{new Float(accpty)}); } catch(Throwable thr) {;}
}
return (img==null ? null : new DctImage(img));
}