2010-06-06 13 views
2

J'ai une image java2d définie dans l'espace utilisateur (mm) pour imprimer une carte d'identité. La transformation en pixels s'effectue en utilisant un AffineTransform pour le DPI requis (Screen ou print).Utilisation des mesures de l'espace utilisateur java2d avec TextLayout et LineBreakMeasurer

Je souhaite placer le texte sur plusieurs lignes mais le TextLayout ne respecte pas les coordonnées de l'espace utilisateur. J'utilisais ce qui suit pour écrire du texte enveloppé dans une région:

private void drawParagraph(Graphics2D g2d, Rectangle2D area, String text) { 
    LineBreakMeasurer lineMeasurer; 
    AttributedString string = new AttributedString(text); 
    AttributedCharacterIterator paragraph = string.getIterator(); 
    int paragraphStart = paragraph.getBeginIndex(); 
    int paragraphEnd = paragraph.getEndIndex(); 
    FontRenderContext frc = g2d.getFontRenderContext(); 
    lineMeasurer = new LineBreakMeasurer(paragraph, frc); 

    float breakWidth = (float)area.getWidth(); 
    float drawPosY = (float)area.getY(); 
    float drawPosX = (float)area.getX(); 
    lineMeasurer.setPosition(paragraphStart); 
    while (lineMeasurer.getPosition() < paragraphEnd) { 
     TextLayout layout = lineMeasurer.nextLayout(breakWidth); 

     drawPosY += layout.getAscent(); 
     layout.draw(g2d, drawPosX, drawPosY); 

     drawPosY += layout.getDescent() + layout.getLeading(); 
    }   
} 

Le code ci-dessus détermine les mesures de police à l'aide de dimensionnement de l'espace utilisateur de la police et donc se révéler assez grand. La taille de la police est calculée pour correspondre au mieux au nombre de lignes dans une zone avec le calcul ci-dessous. Par exemple.

attr.put(TextAttribute.SIZE, (geTextArea().getHeight()/noOfLines - LINE_SPACING)); 

Lorsque vous utilisez g2d.drawString ("texte à afficher", x, y) la taille de la police semble correcte.

Quelqu'un at-il une meilleure façon de faire la mise en page de texte dans les espaces de l'utilisateur?

+0

Où définissez-vous les attributs sur le TextLayout? C'est l'étape la plus importante, et elle n'est pas montrée ici. –

+0

Je ne suis pas sûr que vous pouvez définir des attributs comme il est créé en utilisant le LineBreakMeasurer (while loop). Les docs java pour LineBreakMeasurer disent qu'il ne fait pas de traduction vers les espaces d'utilisateur. Le code ci-dessus est un livre de texte tiré du code de tutoriel de Sun. Je me demandais si quelqu'un est au courant d'une autre façon de faire cela? –

Répondre

0

Un appel à g2d.scale() au début devrait le faire (cela a fonctionné quand je l'ai fait, et mon code est basé sur le même exemple LineBreakMeasurer).