Forum Stats

  • 3,814,398 Users
  • 2,258,870 Discussions
  • 7,892,696 Comments

Discussions

Why does java.awt.font.TextLayout.draw() result into incorrect spacing between Words/Characters when

HarshaSK
HarshaSK Member Posts: 84
edited Nov 14, 2014 4:12AM in Abstract Window Toolkit (AWT)

Hi,

I am writing the same Attributed String using TextLayout.draw() on an Applet as well as on a Frame

In TextLayout, incorrect spacing between Words/Characters are observed when oblique(Italic/Bold Italic) fonts are used on an Applet, while the same Attributed String is rendered correctly on a Frame

Below is a stand alone code to demonstrate the difference between writing an AttributedString using java.awt.font.TextLayout on an Applet as well on a Frame

Below code is for demonstrating TextLayout on a Frame. This works Fine.

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

Below is the code to demonstrate TextLayout on Applet. This gives more space after italic charaters. Is this a bug in 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();
    }


}

This discussion has been closed.