一、设置Graphics属性让绘制文本时让文本变得清晰
1.开启抗锯齿
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
2.开启文本抗锯齿,效果同1
g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HRGB);
3.开启文字平滑策略(平滑策略已经包含抗锯齿效果)
Map desktopHints = (Map) Toolkit.getDefaultToolkit().getDesktopProperty("awt.font.desktophints");
if (desktopHints != null) {
g2d.addRenderingHints(desktopHints);
}
工具包的桌面属性官网:http://docs.oracle.com/javase/6/docs/api/java/awt/doc-files/DesktopProperties.html
在重写组件的绘制方法时,即使开启抗锯齿绘制的文字也仍然是模糊的,这就需要第4个技巧了:
4.使用SwingUtilities2工具类绘制让文本变得清晰
SwingUtilities2.drawString(component, graphics, text, x ,y);
SwingUtilities2.drawStringUnderlineCharAt(component, graphics, text, -1, x ,y);
绘制清晰度测试代码:
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.Toolkit;
import java.util.Map;
import javax.swing.JComponent;
import javax.swing.JFrame;
import sun.swing.SwingUtilities2;
public class Test {
public static void main(String[] args) {
JFrame frame = new JFrame("清晰度绘制测试");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(500, 500);
frame.setLocationRelativeTo(null);
JComponent component = new JComponent() {
public void paint(Graphics g) {
Graphics2D g2d = (Graphics2D) g;
g2d.setColor(Color.WHITE);
g2d.fillRect(0, 0, getWidth(), getHeight());
g2d.setColor(Color.BLACK);
g2d.setFont(new Font("宋体", Font.PLAIN, 50));
g2d.drawString("NotAntialias String字符串", 20, 60);// NotDesktopHints And NotAntialias
if (g2d.getRenderingHints() == null) {
g2d.setRenderingHints(new RenderingHints(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON));
} else {
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
}
g2d.drawString("Antialias String字符串", 20, 120);// NotDesktopHints And Antialias
Toolkit tk = Toolkit.getDefaultToolkit();
Map desktopHints = (Map) (tk.getDesktopProperty("awt.font.desktophints"));
if (desktopHints != null) {
g2d.addRenderingHints(desktopHints);
}
g2d.drawString("DesktopHints String字符串", 20, 180);// DesktopHints And Antialias
SwingUtilities2.drawStringUnderlineCharAt(this, g2d, "SwingUtilities2 String字符串", -1, 20, 240);//SwingUtilities2
}
};
frame.add(component);
frame.setVisible(true);
}
}
绘制清晰度测试运行效果:
可以观察到,DesktopHints(第三行文字)和SwingUtilities2(第四行文字)都是最清晰也是最圆滑的,证明DesktopHints和SwingUtilities2不只是单独设置了抗锯齿,还设置了别的提高清晰度和圆滑的属性到Graphics中。
未完待续,讲解其他绘制技术。。。