我想知道为什么在我的框架中显示文本必须如此模糊,我发现了这段代码,它的工作方式是
public void paint(Graphics graphicsObject){
if(graphicsObject instanceof Graphics2D){
Graphics2D g2D = (Graphics2D) graphicsObject;
g2D.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
}
graphicsObject.drawString("not blurry text display", 200, 200);
}
很难理解这是怎么回事。
- 为什么
g2D.setRenderingHint
正在修复我的模糊问题,但我没有用它来绘制我的字符串
首先,修复的不是模糊。这是混叠。
当绘图函数试图使用光栅图像(像素矩阵,即正方形)创建曲线形状时,会出现混叠。如果线条不是垂直或水平的,那么最终会出现"楼梯"——锯齿状的边缘。
抗锯齿是一种使这种效果对眼睛不太可见的方法,方法是在绘制的线周围使用额外的像素,这些像素在前景和背景之间以不同的色调绘制。这欺骗了我们的眼睛,让我们把线条看作是"平滑的"。如果缩放使用抗锯齿绘制的图像,您可能会注意到实际线条周围的像素。
所以,实际上,抗锯齿模糊了线条,这让我们的眼睛看起来更光滑。
至于你的实际问题——你正在使用图形对象来画线。通过以Graphics2D
的形式访问图形对象,可以在图形对象中设置提示。即使随后继续使用graphicsObject
并使用其常规Graphics
引用,方法drawString()
也会被覆盖。这意味着它将在实现它的具体对象中被激活,该对象可以看到并使用存储提示的RenderingHint
哈希图。
但是我不用它来画我的绳子?
你为什么这么认为?因为,你实际上在使用它。
如今,Graphics始终是Graphics2D对象,因此您的if语句将被执行。
CCD_ 7和CCD_。对于编译器来说,它们是不同类型的两个变量,允许调用不同的方法,但在执行时,这两个变量实际上指向同一个对象。
因此,通过在g2D
上设置渲染提示,这与graphicsObject
是同一个对象,绘制字符串将尊重该提示,并通过使用提示中指定的抗锯齿来修复模糊性。