码:
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import javax.swing.JFrame;
public class TextRectangle extends JFrame {
private static final long serialVersionUID = 1L;
public static void main(String[] a) {
TextRectangle f = new TextRectangle();
f.setSize(300, 300);
f.setVisible(true);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public void paint(Graphics g) {
Graphics2D g2d = (Graphics2D) g;
g2d.setRenderingHint(
RenderingHints.KEY_TEXT_ANTIALIASING,
RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
g2d.setRenderingHint(
RenderingHints.KEY_RENDERING,
RenderingHints.VALUE_RENDER_QUALITY);
g2d.setColor(Color.WHITE);
g2d.fillRect(0, 0, getWidth(), getHeight());
g2d.setColor(Color.BLACK);
g2d.setFont(new Font("Calibri", Font.BOLD, 18));
g2d.drawString("Why does this text look so ugly?", 30, 150);
}
}
Run Code Online (Sandbox Code Playgroud)
结果:

如你所见,字母间距不均匀.有时它是1像素,有时是2像素甚至3像素.另一个问题是'i'上方的点比底部宽.

在文本编辑器中编写的相同文本看起来要好得多.你知道如何解决这个问题吗?
我的环境是Windows 8.1,Java 1.8.
Pet*_*ser 21
图形上下文默认使用整数度量 - 意味着舍入应用于字形形状的位置向量.
您可以使用以下方法切换到小数指标:
g2d.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS,
RenderingHints.VALUE_FRACTIONALMETRICS_ON);
Run Code Online (Sandbox Code Playgroud)

如您所见,没有使用子像素抗锯齿(仅灰色抗锯齿像素).您可以启用子像素抗锯齿,以便在LCD屏幕上获得更好的易读性:
g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HRGB);
Run Code Online (Sandbox Code Playgroud)

有4种模式:
VALUE_TEXT_ANTIALIAS_LCD_HRGB:水平定向RGBVALUE_TEXT_ANTIALIAS_LCD_HBGR:水平定向BGRVALUE_TEXT_ANTIALIAS_LCD_VRGB:垂直方向的RGBVALUE_TEXT_ANTIALIAS_LCD_VBGR:垂直方向BGR我还没有找到在哪里查询当前显示和方向的适当值.某些显示可以倾斜(横向/纵向)甚至旋转,需要在绘画时重新检测模式.
编辑
我在Filthy Rich Clients一书中找到了一些东西:显然,Java AWT Toolkit可以提供适当的渲染提示:
Map<?, ?> desktopHints =
(Map<?, ?>) Toolkit.getDefaultToolkit().getDesktopProperty("awt.font.desktophints");
Graphics2D g2d = (Graphics2D) g;
if (desktopHints != null) {
g2d.setRenderingHints(desktopHints);
}
// no need to set more rendering hints
Run Code Online (Sandbox Code Playgroud)
在我的系统上,这会使用小数指标和LCD HRGB抗锯齿渲染文本,与上面的代码相同.我系统的提示是: