textlayout in this case is getting outlines from the characters and I seem
to recall that it has a problem doing this with some of the fonts on
Taiwanese Windows 98. You may want to try alternate fonts.
I don't mean install new ones, I mean enumerate all the fonts using
GraphicsEnvironment.getAvailableFontFamilyNames() and try each of the
ones that support the characters you need. Some may appear better than
the one you are getting now.

-phil.

> Date: Wed, 19 Sep 2001 00:26:40 +0800
> From: "Jason T. S. Chow" <[EMAIL PROTECTED]>
> Subject: [JAVA2D] Printing Chinese characters
> To: [EMAIL PROTECTED]
> 
>  Hello all,
> 
>   I have been wriiten a program that prints styled Chinese characters,
> using TextLayout class. The strokes are incorrect, some shorter, some longer.
> The TextLayout firstly layout the text and attributes with specified width
> and height (in case word wrapping is needed), then when printing , the 
Graphics
> object pass into the textLayout.draw method to print the text. I found that
> there is no problem when rendering on screen, and also print using drawString
> method. Is anyone know how to solve this problem? thanks in advance. Here is
> the standalone testing program. I am using Window 98 Taiwan Edition,
> JDK 1.3.1 international, and I have set locale to TW (Taiwan).
> 
> Jason
> 
> import java.text.*;
> import java.util.*;
> import java.awt.*;
> import java.awt.font.*;
> import java.awt.event.*;
> import java.awt.print.*;
> import java.awt.image.*;
> import javax.swing.*;
> import javax.swing.event.*;
> import javax.swing.text.*;
> 
> public class Test extends JFrame {
>   public static void main(String[] args) {
>     Locale.setDefault(Locale.CHINESE);
>     Test test = new Test();
>     test.setVisible(true);
>   }
> 
>   PrinterJob job;
>   PageFormat pageFormat;
> 
>   DrawingPanel drawingPanel  = new DrawingPanel();
>   JPanel buttonPanel = new JPanel();
>   JButton printButton = new JButton("Print");
> 
>   Test() {
>     super("Test");
> 
>     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
> 
>     drawingPanel.setPreferredSize(new Dimension(500, 400));
>     getContentPane().add(drawingPanel, BorderLayout.CENTER);
> 
>     printButton.addActionListener(new ActionListener() {
>       public void actionPerformed(ActionEvent ae) {
>         job = PrinterJob.getPrinterJob();
>         pageFormat = job.defaultPage();
> 
>         job.setPrintable(drawingPanel, pageFormat);
>         job.setCopies(1);
> 
>         if (job.printDialog()) {
>           try {
>             job.print();
>           }
>           catch (Exception e) {
>             System.out.println("FilePrint : " + e);
>           }
>         }
>       }
>     });
>     buttonPanel.add(printButton);
>     getContentPane().add(buttonPanel, BorderLayout.SOUTH);
> 
>     pack();
>   }
> }
> 
> class DrawingPanel extends JPanel implements Printable {
>   static final String chineseText = 
"\ufe51\ufe50\ufe55\ufe54\ufe56\ufe57\u300c\u300d\u3002\u3010\u3011\u3014\u3015\
u4e0d\u662f\u516c\u6709\u7684; \u4e0d\u80fd\u88ab\u5916\u90e8\u5305";
> 
>   DefaultStyledDocument document = new DefaultStyledDocument();
>   String text = chineseText;
>   Vector textVector;
>   Vector attrStrVector;
>   int x = 0;
>   int y = 0;
>   int width = 400;
>   int height = 400;
>   int lineSpacing = 5;
>   Color textColor = Color.black;
> 
>   DrawingPanel() {
>     super(false);
>     try {
>       SimpleAttributeSet attrSet1 = new SimpleAttributeSet();
>       document.insertString(0, chineseText, attrSet1);
>     }
>     catch (BadLocationException ble) {
>     }
>   }
> 
>   public void draw(Graphics2D g,int x,int y) {
>     Vector cache = layout(g);
>     textDraw(g, cache, x, y);
>   }
> 
>   private void textDraw(Graphics2D g2d,Vector cache,int offsetX,int offsetY) {
>     int accHeight = 0;
> 
>     for (int i=0; i < cache.size(); i++) {
>       TextLayout textLayout = (TextLayout)cache.elementAt(i);
>       accHeight += textLayout.getAscent();
>       g2d.setColor(textColor);
>       textLayout.draw(g2d, offsetX + x + 1,
>                       offsetY + y + 1 + accHeight);
>       accHeight += (textLayout.getDescent() + (textLayout.getLeading() * 
lineSpacing));
>     }
> 
>     textVector.clear();
>     attrStrVector.clear();
>   }
> 
>   public void paint(Graphics _g) {
>     Graphics2D g = (Graphics2D) _g;
>     g.setColor(Color.white);
>     g.fillRect(0, 0, getWidth(), getHeight());
> 
>     draw(g, 10, 10);
>     g.dispose();
>   }
> 
>   public int print(Graphics _g, PageFormat pageFormat, int pageIndex) throws 
PrinterException {
>     if (pageIndex >= 1) {
>       _g.dispose();
>       return Printable.NO_SUCH_PAGE;
>     }
> 
>     RepaintManager.currentManager(this).setDoubleBufferingEnabled(false);
> 
>     Graphics2D g = (Graphics2D) _g;
>     g.setColor(Color.white);
>     g.fillRect(0,
>                0,
>                (int)pageFormat.getWidth(),
>                (int)pageFormat.getHeight());
> 
>     int newOffsetX = 0;
>     int newOffsetY = (int)(pageFormat.getImageableHeight() * pageIndex);
> 
>     g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
>                          RenderingHints.VALUE_ANTIALIAS_ON);
>     g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
>                          RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
> 
>     g.setClip((int) pageFormat.getImageableX(),
>               (int) pageFormat.getImageableY(),
>               (int) (pageFormat.getImageableWidth()),
>               (int) (pageFormat.getImageableHeight()));
>     draw(g,
>          (int)(x - newOffsetX + pageFormat.getImageableX()),
>          (int)(y - newOffsetY + pageFormat.getImageableY()));
>     RepaintManager.currentManager(this).setDoubleBufferingEnabled(true);
>     g.dispose();
>     return Printable.PAGE_EXISTS;
>   }
> 
>   private Vector layout(Graphics2D g) {
>     Vector cache = new Vector();
>     float accHeight = 0;
> 
>     TextFormatting formatting = new TextFormatting(document, text);
>     textVector = formatting.getTextVector();
>     attrStrVector = formatting.getAttrStrVector();
> 
>     for (int j = 0; j < attrStrVector.size(); j++) {
>       String text = (String)textVector.elementAt(j);
>       if (text.length() == 0) {
>         AttributedString spaceAs = new AttributedString(" ");
>         AttributedCharacterIterator spaceAci = spaceAs.getIterator();
>         FontRenderContext spaceFrc = g.getFontRenderContext();
>         TextLayout spaceTl = new TextLayout(spaceAci,spaceFrc);
> 
>         float spaceHeight = spaceTl.getAscent() + spaceTl.getDescent() + 
spaceTl.getLeading();
>         accHeight += spaceHeight;
>         cache.addElement(spaceTl);
> 
>         continue;
>       }
> 
>       AttributedString as = (AttributedString)attrStrVector.elementAt(j);
> 
>       FontRenderContext frc = g.getFontRenderContext();
>       AttributedCharacterIterator aci = as.getIterator();
>       LineBreakMeasurer lbm = new LineBreakMeasurer(aci,frc);
> 
>       lbm.setPosition(0);
>       int i = 0;
>       while (true) {
>         TextLayout textLayout = lbm.nextLayout(width - 2);
>         if (textLayout == null)
>           break;
>         accHeight += (textLayout.getAscent() + textLayout.getDescent());
>         if (accHeight > height - 2)
>           break;
> 
>         cache.addElement(textLayout);
>         accHeight += (textLayout.getLeading() * lineSpacing);
>       }
>     }
> 
>     return cache;
>   }
> }
> 
> class TextFormatting {
>   DefaultStyledDocument document;
>   String text;
> 
>   Vector textVector = new Vector();
>   Vector attrStrVector = new Vector();
> 
>   TextFormatting(DefaultStyledDocument document, String text) {
>     this.document = document;
>     this.text = text;
> 
>     format();
>   }
> 
>   private void format() {
>     boolean quit = false;
>     int index = 0, increment = 1;
>     int nextIndex;
>     int textIndex = 0;
>     String subText;
>     if (text.indexOf("\r\n") != -1)
>       increment = 2;
> 
>     while (!quit) {
>       if (increment == 2)
>         nextIndex = text.indexOf("\r\n",index);
>       else
>         nextIndex = text.indexOf("\n",index);
> 
>       if (nextIndex == -1) {
>         subText = text.substring(index);
>         quit = true;
>       }
>       else {
>         subText = text.substring(index,nextIndex);
>       }
>       textVector.addElement(subText);
> 
>       AttributedString as = new AttributedString(subText);
>       for (int i = 0; i < subText.length(); i++) {
>         Element ele = document.getCharacterElement(textIndex++);
>         AttributeSet attrSet = ele.getAttributes();
>         Font f = document.getFont(attrSet);
>         as.addAttribute(TextAttribute.FONT, f, i, i + 1);
> 
>         if (StyleConstants.isUnderline(attrSet)) {
>           as.addAttribute(TextAttribute.UNDERLINE,
>                           TextAttribute.UNDERLINE_ON,
>                           i,
>                           i + 1);
>         }
>       }
>       attrStrVector.addElement(as);
> 
>       index = nextIndex + increment;
>       textIndex++;
>     }
>   }
> 
>   public Vector getTextVector() {
>     return this.textVector;
>   }
> 
>   public Vector getAttrStrVector() {
>     return this.attrStrVector;
>   }
> }
> 
> ----------------------------------------------
>  �w��ϥ�HongKong.com�l��t��
>  Thank you for using hongkong.com Email system
> 
> ===========================================================================
> To unsubscribe, send email to [EMAIL PROTECTED] and include in the body
> of the message "signoff JAVA2D-INTEREST".  For general help, send email to
> [EMAIL PROTECTED] and include in the body of the message "help".

==========================================================================To 
unsubscribe, send email to [EMAIL PROTECTED] and include in the body
of the message "signoff JAVA2D-INTEREST".  For general help, send email to
[EMAIL PROTECTED] and include in the body of the message "help".

Reply via email to