Java 操作系统X上乱七八糟的缓冲区图像字体

Java 操作系统X上乱七八糟的缓冲区图像字体,java,swing,fonts,rendering,bufferedimage,Java,Swing,Fonts,Rendering,Bufferedimage,出于某种原因,绘制到BuffereImage的字符串与直接绘制到JComponent的字符串看起来有所不同 这里有一个例子。直接绘制顶部字符串,而使用缓冲区绘制底部字符串 这是怎么回事 import javax.swing.*; import java.awt.*; import java.awt.image.BufferedImage; import java.util.Map; public class Main { static class Canvas extends JCo

出于某种原因,绘制到BuffereImage的字符串与直接绘制到JComponent的字符串看起来有所不同

这里有一个例子。直接绘制顶部字符串,而使用缓冲区绘制底部字符串

这是怎么回事

import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.util.Map;

public class Main {

    static class Canvas extends JComponent
    {
        @Override
        public void paintComponent(Graphics g)
        {

            g.setColor(Color.WHITE);
            g.fillRect(0, 0, this.getWidth(), this.getHeight());
            g.setColor(Color.BLACK);
            g.drawString("OMFG look at this 'S'", 10, 20);

            BufferedImage bi = new BufferedImage(150,50,BufferedImage.TYPE_INT_RGB);
            Graphics2D imageG =  bi.createGraphics();
            imageG.setColor(Color.WHITE);
            imageG.fillRect(0, 0, 150, 50);
            imageG.setColor(Color.BLACK);
            imageG.setFont(g.getFont());
            imageG.drawString("OMFG look at this 'S'", 10, 10);

            g.drawImage(bi, 0, 30, this);

        }
    }
    public static void main(String[] args) {
        JFrame jf = new JFrame();
        jf.setMinimumSize(new Dimension(150, 80));
        jf.add(new Canvas());
        jf.setVisible(true);

    }
}

如果添加imageG.setRenderingHintsGraphics2Dg.getRenderingHints;,会发生什么?在某些系统上,请尝试apple.awt.graphics.UseQuartz,例如。如果手动设置一些渲染提示,会怎么样?例如imageG.setRenderingHintRenderingHints.KEY\u TEXT\u抗锯齿、RenderingHints.VALUE\u TEXT\u抗锯齿启用;imageG.setRenderingHintRenderingHints.KEY\u RENDERING,RenderingHints.VALUE\u RENDER\u QUALITY@s1ice:你能用TextLayout试试吗?因为视网膜似乎意味着150像素的组件实际上是这个大小的两倍,所以你可以通过使用300像素的缓冲区并在组件上缩放到150像素来获得最佳渲染效果。尽管这样做有效,但我不知道这是否真的是正确的解决方案。