0

我在 Applet 和 Frame 上使用 TextLayout.draw() 编写相同的属性字符串

在 TextLayout 中,当在 Applet 上使用倾斜(斜体/粗斜体)字体时,会观察到单词/字符之间的间距不正确,而在 Frame 上正确呈现相同的 Attributed String

下面是一个独立代码,用于演示在 Applet 和 Frame 上使用 java.awt.font.TextLayout 编写 AttributedString 之间的区别

下面的代码用于在 Frame 上演示 TextLayout。这很好用。

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);  
 }        

}

下面是在 Applet 上演示 TextLayout 的代码。这在斜体字符之后提供了更多空间。这是 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();  
}  


}  
4

0 回答 0