为什么java.awt.font.TextLayout.draw()在使用斜体(斜体/粗斜体)字体时会导致单词/字符之间



我在小程序和框架上使用TextLayout.draw()编写相同的属性字符串

在 TextLayout 中,当在小程序上使用倾斜(斜体/粗斜体)字体时,观察到单词/字符之间的间距不正确,而在框架上正确呈现相同的属性字符串

下面是一个独立的代码,用于演示在小程序上使用java.awt.font.TextLayout以及在框架上使用java.awt.font.TextLayout编写AttributedString之间的区别

下面的代码用于演示框架上的文本布局。这工作正常。

import java.awt.BorderLayout;  
import java.awt.Component;  
import java.awt.Font;  
import java.awt.Frame;  
import java.awt.Graphics;  
import java.awt.Graphics2D;  
import java.awt.event.ComponentEvent;  
import java.awt.font.FontRenderContext;  
import java.awt.font.TextAttribute;  
import java.awt.font.TextLayout;  

import java.text.AttributedString;  

import javax.swing.JPanel;  

public class GraphViewer extends Frame  
{  
 public static void main(String[] args)  
  {  
      Component viewer = new GraphViewer(new test());  
      viewer.show();  
  }  
 public GraphViewer( Component component)  
 {  
     setLayout(new BorderLayout(0,0));  
     setVisible(true);  
     setSize(800,600);  
     setTitle("Viewer");  
     add("Center", component);  
     addWindowListener(new SymWindow());  
 }  
 public void paint(Graphics2D graphics)  
 {  
     graphics.clearRect(0,0,800, 600);  
     super.paint(graphics);  
 }  
 public class SymComponent extends java.awt.event.ComponentAdapter  
 {  
     public void ComponentResized(ComponentEvent event)  
     {  
         Object object = event.getSource();  
         if(object == GraphViewer.this)  
         {  
         }  
     }  
 }  

 public class SymWindow extends java.awt.event.WindowAdapter  
 {  

     public void windowClosing(java.awt.event.WindowEvent event)  
     {  
         Object object = event.getSource();  
         if (object == GraphViewer.this)  
             FrameApp_WindowClosing(event);  
     }  

     void FrameApp_WindowClosing(java.awt.event.WindowEvent event)  
     {  

         setVisible(false); // hide the Frame  
         dispose(); // free the system resources  
         System.exit(0); // close the application  
     }  
 }  
}  
class test extends JPanel  
{  
 public Font getFont()  
 {  
     return new Font("Arial", Font.BOLD, 15);  
 }  

 synchronized public void paintComponent(Graphics g)  
 {  
     test1(g);  
 }  
 void test1(Graphics g)  
 {  
     Graphics2D g2 = (Graphics2D)g;  
     FontRenderContext frc = g2.getFontRenderContext();  
     java.awt.Font graphicsFont = new java.awt.Font("Arial", Font.PLAIN, 15);  
     AttributedString result = new AttributedString ("This is a test to check partial text formatting.");  
     graphicsFont  = graphicsFont.deriveFont(java.awt.Font.ITALIC);  
     result.addAttribute(TextAttribute.FONT, graphicsFont, 1, 10);  
     result.addAttribute(TextAttribute.FONT, graphicsFont, 15, 22);  
     result.addAttribute(TextAttribute.FONT, graphicsFont, 25, 31);  
     result.addAttribute(TextAttribute.WEIGHT, TextAttribute.WEIGHT_BOLD);  
     TextLayout layout = new TextLayout(result.getIterator(),g2.getFontRenderContext());  
     layout.draw(g2, 100,100);  
 }        

}

下面是在小程序上演示文本布局的代码。这在斜体字符之后提供了更多空间。这是TextLayout中的错误吗?

import java.awt.Color;  
import java.awt.Font;  
import java.awt.Graphics;  
import java.awt.Graphics2D;  
import java.awt.font.TextAttribute;  
import java.awt.font.TextLayout;  

import java.text.AttributedString;  

import java.util.StringTokenizer;  

import javax.swing.JApplet;  


public class TestTextLayoutApplet extends JApplet {  
public TestTextLayoutApplet() {  
    super();  
}  

public void init(){  
    System.out.println("In TestTextLayout Init");  
}  

public void paint(Graphics g) {  
    Graphics2D g2 = (Graphics2D)g;  
    java.awt.Font graphicsFont = new java.awt.Font("Arial", Font.BOLD, 15);  
    g2.setFont(graphicsFont);  

    AttributedString attStr = new AttributedString("This is a test to check partial text formatting.");  
    attStr.addAttribute(TextAttribute.FONT, g2.getFont());  
    graphicsFont = graphicsFont.deriveFont(java.awt.Font.ITALIC);  
    attStr.addAttribute(TextAttribute.FONT, graphicsFont, 1, 10);  
    attStr.addAttribute(TextAttribute.FONT, graphicsFont, 15, 22);  
    attStr.addAttribute(TextAttribute.FONT, graphicsFont, 25, 31);  
    attStr.addAttribute(TextAttribute.WEIGHT, TextAttribute.WEIGHT_BOLD);  

    /** Writing with TextLayout */  
    TextLayout textLayout = new TextLayout(attStr.getIterator(), g2.getFontRenderContext());  
    g2.setColor(Color.BLUE);  
    textLayout.draw(g2, 20, 100);  
    g2.dispose();  
}  

}  
我知道

这是一个旧帖子,但没有人回答过这个问题,我知道答案。答案是肯定的,肯定有这样的错误,填充被错误地添加到斜体文本行(在文本布局内)。我知道该错误至少在 1.8 之前仍然存在,但它在某个时候得到了修复。我不知道是什么版本,我在网上找不到错误报告,但肯定是 Java 17。

它似乎不会影响Java模拟斜体的字体,但它肯定发生在真正的斜体面上,例如Arial Italic。

最新更新