Когда я выполняю свое колебание приложения GUI под Java 6, они автоматически используют мои настроенные субпиксельные настройки сглаживания для всех шрифтов. Результат очень улучшен по стандартным опциям AA.
Но когда я крашу к изображению, я не могу найти способ инициализировать графический контекст для использования конфигурации AA системы. Попытка играть вокруг с различными подсказками AA Java является проигранным делом, потому что никакой субпиксельный метод не будет работать на всех пользователей.
Там какой-либо путь состоит в том, чтобы наследовать системные настройки AA для данного графического контекста вместо того, чтобы иметь необходимость выбрать один и явно установить подсказку? В данный момент я должен использовать УДУШЬЕ AA для предотвращения ужасных результатов, которые стандартный AA дает с мелкими шрифтами. Я попытался ничего не установить для текста AA и не установить любые намеки AA на все.
Обновление 05.01.2010
Я думаю, что придавил это; субпиксель подсказки AA, кажется, только уважают при рисовании непосредственно к графическому контексту AWT; когда я крашу к двойному буферу, отображают его, просто делает стандартный AA; но когда я обхожу изображение двойного буфера субпиксель, AA сделан.
Иначе ответ The_Fire работал бы в JVMs, которые имеют Swing в наличии (но не J2ME JVMs); Обратите внимание, что ответ The_Fire не работает с помощью компонента AWT (использование новой Маркировки () вместо нового 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, который формирует фон, на котором я делаю все свое рисование - компонентом является Панель, потому что я должен смочь сделать 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));
}