首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java字体渲染

Java字体渲染
EN

Stack Overflow用户
提问于 2010-01-07 03:50:40
回答 2查看 9.6K关注 0票数 11

我一直试图增强用Java编写的GUI系统,以使用亚像素反混叠,并取得了成功,除了剩下的两个异常。这是我的几周前的另一个问题的后续内容。

第一个问题是,将呈现提示KEY_ANTIALIASING设置为VALUE_ANTIALIAS_ON会导致KEY_TEXT_ANTIALIASING在设置为LCD (亚像素) AA值时被忽略。有人能解释一下这件事吗?目前,我被迫在渲染文本之前使用VALUE_ANTIALIAS_OFF,并在呈现文本后将其打开(因此其他绘画,如圆圈等,是AA‘d’)。下面的自给测试程序证明了这个问题。

第二个问题是,我无法查询AA的底层O/S设置,所以我必须做一个非常简单的解决方法,就是创建一个Swing JLabel,获取它的FontMetrics,得到它的FontRenderContext,然后从它得到AA提示。除了将Swing包含在一个否则完全不使用Swing的程序中之外,它不会在运行任何J2ME JVM的设备上工作。有人能提出更好的方法吗?如果它需要J5或J6,也可以,因为当前的传说已经需要J6 (但是只需要J4才是最好的)。我已经尝试了每个默认设置,并使用了一个AWT组件而不是JLabel

测试程序

该程序验证了要使亚像素AA工作,必须首先禁用一般AA设置。(PS:我写回缓冲区,因为我的底层GUI是这样写的,我想在一个等价的上下文中进行测试)。

代码语言:javascript
复制
import java.awt.*;
import java.awt.event.*;

public class AwtTestFrame1b extends Panel {

private final Font                      font=new Font(Font.SANS_SERIF, Font.PLAIN, 16);
private final int                       line=25;

AwtTestFrame1b() {
    setBackground(SystemColor.control);
    }

public void paint(Graphics g) {
    Graphics2D g2d = (Graphics2D)g;

    int                                 py=0;

    py=paintText(g2d,py,null                                        ,false);
    py=paintText(g2d,py,null                                        ,true );
    py+=line;

    py=paintText(g2d,py,RenderingHints.VALUE_TEXT_ANTIALIAS_OFF     ,false);
    py=paintText(g2d,py,RenderingHints.VALUE_TEXT_ANTIALIAS_DEFAULT ,false);
    py=paintText(g2d,py,RenderingHints.VALUE_TEXT_ANTIALIAS_ON      ,false);
    py=paintText(g2d,py,RenderingHints.VALUE_TEXT_ANTIALIAS_GASP    ,false);
    py=paintText(g2d,py,RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HRGB,false);
    py+=line;

    py=paintText(g2d,py,RenderingHints.VALUE_TEXT_ANTIALIAS_OFF     ,true );
    py=paintText(g2d,py,RenderingHints.VALUE_TEXT_ANTIALIAS_DEFAULT ,true );
    py=paintText(g2d,py,RenderingHints.VALUE_TEXT_ANTIALIAS_ON      ,true );
    py=paintText(g2d,py,RenderingHints.VALUE_TEXT_ANTIALIAS_GASP    ,true );
    py=paintText(g2d,py,RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HRGB,true );
    py+=line;
    }

private int paintText(Graphics2D g2d, int py, Object val, boolean aa) {
    Graphics2D                          dgc=g2d;
    char[]                              txt=("The quick brown fox jumped over the lazy dog ("+val+", General AA: "+aa+")").toCharArray();
    Image                               img=null;

    GraphicsConfiguration cfg=getGraphicsConfiguration();
    img=cfg.createCompatibleImage(getWidth(),line);
    dgc=(Graphics2D)img.getGraphics();
    dgc.setColor(getBackground());
    dgc.fillRect(0,0,getWidth(),line);
    dgc.setColor(g2d.getColor());

    if(aa       ) { dgc.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON ); }
    else          { dgc.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_OFF); }
    if(val!=null) { dgc.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,val); }
    dgc.setFont(font);

    dgc.drawChars(txt,0,txt.length,10,line-5);
    g2d.drawImage(img,  0,py,  null);

    dgc.dispose();
    img.flush();

    return (py+line);
    }

public static void main(String[] args) {
    Frame                               wnd=new Frame("AWT Antialiased Text Sample");

    wnd.addWindowListener(new WindowAdapter() {
        public void windowClosing(WindowEvent e) {
            System.exit(0);
            }
        });
    wnd.add(new AwtTestFrame1b());
    wnd.setSize(new Dimension(1000, 600));
    wnd.setVisible(true);
    }

}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-01-07 04:57:04

AWT桌面属性有帮助吗?特别是"awt.font.desktophints“--这些包含本机组件使用的AA提示,但可以应用于任何您想要的Graphics2D。

只是在黑暗中拍摄,最近阅读了“肮脏的富客户”中的AA部分。

Use看起来应该是这样的:

代码语言:javascript
复制
String str = "A quick brown fox jumps over the lazy dog";
Toolkit tk = Toolkit.getDefaultToolkit();
Map desktopHints = (Map)(tk.getDesktopProperty("awt.font.desktophints"));
Graphics2D g2d = (Graphics2D)g;

if(desktopHints != null) {
    g2d.addRenderingHints(desktopHints);
}

g2d.drawString(str, someX, someY);

我能够获得相同的结果(使用示例类以及drawChars和drawImage,为了简单起见,只输入了drawString )与使用这些提示的LCD模式相同,在我的机器上没有其他调用。

我不知道这需要什么版本的Java,如果这是你想要的.

票数 10
EN

Stack Overflow用户

发布于 2010-01-07 04:23:37

不要忘记:“实现可以完全忽略http://java.sun.com/javase/6/docs/api/java/awt/RenderingHints.html。”作为参考,以下是我在24点看到的:

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2018102

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档