Java 类java.awt.font.LineBreakMeasurer 实例源码

项目:brModelo    文件:DesenhadorDeTexto.java   
private LineBreakMeasurer[] getLineBreakMeasurers(Graphics2D g) {
    if (lbmTexto == null && (Texto != null && !Texto.equals(""))) {
        lbmTexto = new LineBreakMeasurer[Textos.length];
        for (int i = 0; i < lbmTexto.length; i++) {
            String tmp = Textos[i].isEmpty()? " " : Textos[i];
            AttributedString attribString = new AttributedString(tmp);
            attribString.addAttribute(TextAttribute.FONT, getFont());
            //attribString.addAttribute(TextAttribute.FONT, getFont());
            AttributedCharacterIterator attribCharIterator = attribString.getIterator();
            //FontRenderContext frc = new FontRenderContext(null, true, false);
            FontRenderContext frc = g.getFontRenderContext();
            lbmTexto[i] = new LineBreakMeasurer(attribCharIterator, frc);
        }
    }
    return lbmTexto;
}
项目:FreeCol    文件:FreeColToolTipUI.java   
@Override
public Dimension getPreferredSize(JComponent c) {
    String tipText = ((JToolTip)c).getTipText();
    if (tipText == null || tipText.isEmpty()) {
        return new Dimension(0, 0);
    }

    float x = 0f;
    float y = 0f;
    for (String line : lineBreak.split(tipText)) {
        if (line.isEmpty()) {
            y += LEADING;
            continue;
        }
        AttributedCharacterIterator styledText
            = new AttributedString(line).getIterator();
        LineBreakMeasurer measurer = new LineBreakMeasurer(styledText, frc);

        while (measurer.getPosition() < styledText.getEndIndex()) {

            TextLayout layout = measurer.nextLayout(maximumWidth);

            x = Math.max(x, layout.getVisibleAdvance());
            y += layout.getAscent() + layout.getDescent() + layout.getLeading();

        }
    }
    return new Dimension((int) (x + 2 * margin),
                         (int) (y + 2 * margin));

}
项目:jasperreports    文件:SimpleTextLineWrapper.java   
protected int measureExactLineBreakIndex(float width, int endLimit, boolean requireWord)
{
    //FIXME would it be faster to create and cache a LineBreakMeasurer for the whole paragraph?
    Map<Attribute, Object> attributes = new HashMap<Attribute, Object>();
    // we only need the font as it includes the size and style
    attributes.put(TextAttribute.FONT, fontInfo.fontInfo.font);

    String textLine = paragraphText.substring(paragraphPosition, endLimit);
    AttributedString attributedLine = new AttributedString(textLine, attributes);

    // we need a fresh iterator for the line
    BreakIterator breakIterator = paragraphTruncateAtChar ? BreakIterator.getCharacterInstance()
            : BreakIterator.getLineInstance();
    LineBreakMeasurer breakMeasurer = new LineBreakMeasurer(attributedLine.getIterator(), 
            breakIterator, context.getFontRenderContext());
    int breakIndex = breakMeasurer.nextOffset(width, endLimit - paragraphPosition, requireWord) 
            + paragraphPosition;
    if (logTrace)
    {
        log.trace("exact line break index measured at " + (paragraphOffset + breakIndex));
    }

    return breakIndex;
}
项目:hopsworks    文件:GraphicsUtils.java   
private static void drawTextInBoundedArea(Graphics2D g2d, int x1, int y1,
        int x2, int y2, String text) {
  float interline = 1;
  float width = x2 - x1;
  AttributedString as = new AttributedString(text);
  as.addAttribute(TextAttribute.FOREGROUND, g2d.getPaint());
  as.addAttribute(TextAttribute.FONT, g2d.getFont());
  AttributedCharacterIterator aci = as.getIterator();
  FontRenderContext frc = new FontRenderContext(null, true, false);
  LineBreakMeasurer lbm = new LineBreakMeasurer(aci, frc);
  while (lbm.getPosition() < text.length()) {
    TextLayout tl = lbm.nextLayout(width);
    y1 += tl.getAscent();
    tl.draw(g2d, x1, y1);
    y1 += tl.getDescent() + tl.getLeading() + (interline - 1.0f) * tl.
            getAscent();
    if (y1 > y2) {
      break;
    }
  }
}
项目:tribaltrouble    文件:Test.java   
private final static void pixelDataFromString(int width, int height, String str, java.awt.Font font, int[] pixels, LineBreakMeasurer measurer) {
    measurer.setPosition(0);
    g2d.clearRect(0, 0, width, height);
    g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
    g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
    float wrapping_width = width;
    float y = 0;
    int length = str.length();
    while (measurer.getPosition() < length) {
        TextLayout layout = measurer.nextLayout(wrapping_width);
        y += (layout.getAscent());
        float x = layout.isLeftToRight() ? 0 : (wrapping_width - layout.getAdvance());

        layout.draw(g2d, x, y);
        y += layout.getDescent() + layout.getLeading();
    }
    image.getRaster().getDataElements(0, 0, image.getWidth(), image.getHeight(), pixels);
}
项目:studio    文件:DefaultPrintable.java   
/**
* @param wrappingWidth width of the layout
* @param frCtx for possible new instance of LineBreakMeasurer
* @return next TextLayout that is to be rendered
*/
private TextLayout nextLayout(float wrappingWidth, FontRenderContext frc) {
    TextLayout l;

    if (currentLayout == textLayouts.size()) {
        LineBreakMeasurer old = lineBreakMeasurer;
        LineBreakMeasurer measurer = getMeasurer(frc);
        if (measurer == null) {
            return null;
        }
        l = measurer.nextLayout(wrappingWidth);
        textLayouts.add(l);

        if (old != measurer) { // new line
            startLayouts.add(l);
        }

    } else {
        l = (TextLayout) textLayouts.get(currentLayout);
    }
    currentLayout++; // advance to next
    return l;
}
项目:jrunalyzer    文件:SelectedWaypointRenderer.java   
private void drawText(Graphics2D g2, String text, float width) {
    FontRenderContext frc = g2.getFontRenderContext();

    AttributedString styledText = new AttributedString(text);
    AttributedCharacterIterator aci = styledText.getIterator();
    int start = aci.getBeginIndex();
    int end = aci.getEndIndex();
    LineBreakMeasurer measurer = new LineBreakMeasurer(aci, frc);
    measurer.setPosition(start);

    float x = 0, y = 0;
    while (measurer.getPosition() < end) {
        TextLayout layout = measurer.nextLayout(width);

        y += layout.getAscent();
        float dx = layout.isLeftToRight() ? 0 : width - layout.getAdvance();

        layout.draw(g2, x + dx, y);
        y += layout.getDescent() + layout.getLeading();
    }
}
项目:reactome2gpml-converter    文件:ReactomeToGPMLConverter.java   
private String wrapLines(String s, float wrappingWidth, FontRenderContext frc, String lineBreak) {
    AttributedCharacterIterator aci = new AttributedString(s).getIterator();
    int end = aci.getEndIndex();
    LineBreakMeasurer measurer = new LineBreakMeasurer(aci, frc);
    StringBuffer output = new StringBuffer();
    int position = 0;
    int lastPosition = 0;
    do {
        measurer.nextLayout(wrappingWidth);
        position = measurer.getPosition();
        output.append(s, lastPosition, position);
        output.append(lineBreak);
        lastPosition = position;
    } while (position < end);
    return output.toString();
}
项目:zgrnbviewer    文件:MultilineText.java   
@Override
public void setFont(Font f) {
    super.setFont(f);
    atText.addAttribute(TextAttribute.FONT,
                        usesSpecificFont() ? getFont() : getMainFont());
    lbm = new LineBreakMeasurer(atText.getIterator(), DEFAULT_FRC);
    invalidate();
}
项目:SOEN6471-FreeCol    文件:FreeColToolTipUI.java   
public Dimension getPreferredSize(JComponent c) {
    String tipText = ((JToolTip)c).getTipText();
    if (tipText == null) {
        return new Dimension(0, 0);
    }

    float x = 0f;
    float y = 0f;
    for (String line : lineBreak.split(((JToolTip) c).getTipText())) {
        AttributedCharacterIterator styledText
            = new AttributedString(line).getIterator();
        LineBreakMeasurer measurer = new LineBreakMeasurer(styledText, frc);

        while (measurer.getPosition() < styledText.getEndIndex()) {

            TextLayout layout = measurer.nextLayout(maximumWidth);

            x = Math.max(x, layout.getVisibleAdvance());
            y += layout.getAscent() + layout.getDescent() + layout.getLeading();

        }
    }
    return new Dimension((int) (x + 2 * margin),
                         (int) (y + 2 * margin));

}
项目:Harmonia-1.5    文件:MessageController.java   
private static int countLines(JTextArea textArea)
{
    AttributedString text = new AttributedString(textArea.getText());
    FontRenderContext frc = textArea.getFontMetrics(textArea.getFont()).getFontRenderContext();
    AttributedCharacterIterator charIt = text.getIterator();
    LineBreakMeasurer lbm = new LineBreakMeasurer(charIt, frc);
    float formatWidth = (float) textArea.getSize().width;
    lbm.setPosition(charIt.getBeginIndex());

    int numLines =0;
    while (lbm.getPosition()<charIt.getEndIndex())
    {
        lbm.nextLayout(formatWidth);
        numLines++;
    }   
    return numLines;
}
项目:spark-svn-mirror    文件:JMultilineLabel.java   
private Dimension paintOrGetSize(Graphics2D g, int width) {
    Insets insets = getInsets();
    width -= insets.left + insets.right + margin.left + margin.right;
    float w = insets.left + insets.right + margin.left + margin.right;
    float x = insets.left + margin.left, y = insets.top + margin.top;
    if (width > 0 && text != null && text.length() > 0) {
        AttributedString as = new AttributedString(getText());
        as.addAttribute(TextAttribute.FONT, getFont());
        AttributedCharacterIterator aci = as.getIterator();
        LineBreakMeasurer lbm = new LineBreakMeasurer(aci, frc);
        float max = 0;
        while (lbm.getPosition() < aci.getEndIndex()) {
            TextLayout textLayout = lbm.nextLayout(width);
            if (g != null && isJustified() && textLayout.getVisibleAdvance() > 0.80 * width)
                textLayout = textLayout.getJustifiedLayout(width);
            if (g != null)
                textLayout.draw(g, x, y + textLayout.getAscent());
            y += textLayout.getDescent() + textLayout.getLeading() + textLayout.getAscent();
            max = Math.max(max, textLayout.getVisibleAdvance());
        }
        w += max;
    }
    return new Dimension((int)Math.ceil(w), (int)Math.ceil(y) + insets.bottom + margin.bottom);
}
项目:litiengine    文件:SpeechBubble.java   
@Override
public void render(final Graphics2D g) {
  if (this.displayedText == null || this.displayedText.isEmpty() || !Game.getRenderEngine().canRender(this.entity)) {
    return;
  }

  final Point2D location = Game.getCamera().getViewPortLocation(this.entity);
  RenderEngine.renderImage(g, this.bubble, new Point2D.Double(location.getX() + this.entity.getWidth() / 2.0 - this.textBoxWidth / 2.0 - PADDING, location.getY() - this.height - PADDING));

  g.setColor(SPEAK_FONT_COLOR);
  final FontRenderContext frc = g.getFontRenderContext();

  final String text = this.displayedText;
  final AttributedString styledText = new AttributedString(text);
  styledText.addAttribute(TextAttribute.FONT, this.font);
  final AttributedCharacterIterator iterator = styledText.getIterator();
  final LineBreakMeasurer measurer = new LineBreakMeasurer(iterator, frc);
  measurer.setPosition(0);
  final float x = (float) Game.getCamera().getViewPortLocation(this.entity).getX() + this.entity.getWidth() / 2.0f - this.textBoxWidth / 2.0f;
  float y = (float) Game.getCamera().getViewPortLocation(this.entity).getY() - this.height;
  while (measurer.getPosition() < text.length()) {
    final TextLayout layout = measurer.nextLayout(this.textBoxWidth);

    y += layout.getAscent();
    final float dx = layout.isLeftToRight() ? 0 : this.textBoxWidth - layout.getAdvance();
    layout.draw(g, x + dx, y);
    y += layout.getDescent() + layout.getLeading();
  }
}
项目:freecol    文件:FreeColToolTipUI.java   
@Override
public void paint(Graphics g, JComponent c) {
    if (c.isOpaque()) {
        ImageLibrary.drawTiledImage("image.background.FreeColToolTip", g, c, null);
    }

    g.setColor(Color.BLACK); // FIXME: find out why this is necessary

    Graphics2D graphics = (Graphics2D)g;
    float x = margin;
    float y = margin;
    for (String line : lineBreak.split(((JToolTip) c).getTipText())) {
        if (line.isEmpty()) {
            y += LEADING;
            continue;
        }
        AttributedCharacterIterator styledText =
            new AttributedString(line).getIterator();

        LineBreakMeasurer measurer = new LineBreakMeasurer(styledText, frc);

        while (measurer.getPosition() < styledText.getEndIndex()) {

            TextLayout layout = measurer.nextLayout(maximumWidth);

            y += (layout.getAscent());
            float dx = layout.isLeftToRight() ?
                0 : (maximumWidth - layout.getAdvance());

            layout.draw(graphics, x + dx, y);
            y += layout.getDescent() + layout.getLeading();
        }
    }
 }
项目:freecol    文件:FreeColToolTipUI.java   
@Override
public Dimension getPreferredSize(JComponent c) {
    String tipText = ((JToolTip)c).getTipText();
    if (tipText == null || tipText.isEmpty()) {
        return new Dimension(0, 0);
    }

    float x = 0f;
    float y = 0f;
    for (String line : lineBreak.split(tipText)) {
        if (line.isEmpty()) {
            y += LEADING;
            continue;
        }
        AttributedCharacterIterator styledText
            = new AttributedString(line).getIterator();
        LineBreakMeasurer measurer = new LineBreakMeasurer(styledText, frc);

        while (measurer.getPosition() < styledText.getEndIndex()) {

            TextLayout layout = measurer.nextLayout(maximumWidth);

            x = Math.max(x, layout.getVisibleAdvance());
            y += layout.getAscent() + layout.getDescent() + layout.getLeading();

        }
    }
    return new Dimension((int) (x + 2 * margin),
                         (int) (y + 2 * margin));

}
项目:openjdk-jdk10    文件:TestLineBreakWithFontSub.java   
public void test() {

        // construct a paragraph as follows: MIXED + [SPACING + WORD] + ...
        StringBuffer text = new StringBuffer(MIXED);
        for (int i=0; i < NUM_WORDS; i++) {
            text.append(SPACING);
            text.append(WORD);
        }

        AttributedString attrString = new AttributedString(text.toString());
        attrString.addAttribute(TextAttribute.SIZE, new Float(24.0));

        LineBreakMeasurer measurer = new LineBreakMeasurer(attrString.getIterator(),
                                                           DEFAULT_FRC);

        // get width of a space-word sequence, in context
        int sequenceLength = WORD.length()+SPACING.length();
        measurer.setPosition(text.length() - sequenceLength);

        TextLayout layout = measurer.nextLayout(10000.0f);

        if (layout.getCharacterCount() != sequenceLength) {
            throw new Error("layout length is incorrect!");
        }

        final float sequenceAdvance = layout.getVisibleAdvance();

        float wrappingWidth = sequenceAdvance * 2;

        // now run test with a variety of widths
        while (wrappingWidth < (sequenceAdvance*NUM_WORDS)) {
            measurer.setPosition(0);
            checkMeasurer(measurer,
                          wrappingWidth,
                          sequenceAdvance,
                          text.length());
            wrappingWidth += sequenceAdvance / 5;
        }
    }
项目:openjdk-jdk10    文件:TestLineBreakWithFontSub.java   
/**
 * Iterate through measurer and check that every line is
 * not too long and not too short, but just right.
 */
private void checkMeasurer(LineBreakMeasurer measurer,
                           float wrappingWidth,
                           float sequenceAdvance,
                           int endPosition) {

    do {
        TextLayout layout = measurer.nextLayout(wrappingWidth);
        float visAdvance = layout.getVisibleAdvance();

        // Check that wrappingWidth-sequenceAdvance < visAdvance
        // Also, if we're not at the end of the paragraph,
        // check that visAdvance <= wrappingWidth

        if (visAdvance > wrappingWidth) {
            // line is too long for given wrapping width
            throw new Error("layout is too long");
        }

        if (measurer.getPosition() < endPosition) {
            if (visAdvance <= wrappingWidth - sequenceAdvance) {
                // line is too short for given wrapping width;
                // another word would have fit
                throw new Error("room for more words on line.  diff=" +
                                (wrappingWidth - sequenceAdvance - visAdvance));
            }
        }
    } while (measurer.getPosition() != endPosition);
}
项目:openjdk-jdk10    文件:GlyphVectorOutline.java   
private static void drawString(Graphics2D g, Font font, String value, float x, float y) {
    AttributedString str = new AttributedString(value);
    str.addAttribute(TextAttribute.FOREGROUND, Color.BLACK);
    str.addAttribute(TextAttribute.FONT, font);
    FontRenderContext frc = new FontRenderContext(null, true, true);
    TextLayout layout = new LineBreakMeasurer(str.getIterator(), frc).nextLayout(Integer.MAX_VALUE);
    layout.draw(g, x, y);
}
项目:FreeCol    文件:FreeColToolTipUI.java   
@Override
public void paint(Graphics g, JComponent c) {
    if (c.isOpaque()) {
        ImageLibrary.drawTiledImage("image.background.FreeColToolTip", g, c, null);
    }

    g.setColor(Color.BLACK); // FIXME: find out why this is necessary

    Graphics2D graphics = (Graphics2D)g;
    float x = margin;
    float y = margin;
    for (String line : lineBreak.split(((JToolTip) c).getTipText())) {
        if (line.isEmpty()) {
            y += LEADING;
            continue;
        }
        AttributedCharacterIterator styledText =
            new AttributedString(line).getIterator();

        LineBreakMeasurer measurer = new LineBreakMeasurer(styledText, frc);

        while (measurer.getPosition() < styledText.getEndIndex()) {

            TextLayout layout = measurer.nextLayout(maximumWidth);

            y += (layout.getAscent());
            float dx = layout.isLeftToRight() ?
                0 : (maximumWidth - layout.getAdvance());

            layout.draw(graphics, x + dx, y);
            y += layout.getDescent() + layout.getLeading();
        }
    }
 }
项目:openjdk9    文件:GlyphVectorOutline.java   
private static void drawString(Graphics2D g, Font font, String value, float x, float y) {
    AttributedString str = new AttributedString(value);
    str.addAttribute(TextAttribute.FOREGROUND, Color.BLACK);
    str.addAttribute(TextAttribute.FONT, font);
    FontRenderContext frc = new FontRenderContext(null, true, true);
    TextLayout layout = new LineBreakMeasurer(str.getIterator(), frc).nextLayout(Integer.MAX_VALUE);
    layout.draw(g, x, y);
}
项目:balloonist    文件:OrientableLineBreakMeasurer.java   
public void setHorizontalLineBreakMeasurer(LineBreakMeasurer designatedHorizontalLineBreakMeasurer) throws IllegalArgumentException
{
    if (designatedHorizontalLineBreakMeasurer!=null && verticalLineBreakMeasurer!=null)
        throw new IllegalArgumentException(NOT_BOTH_ERROR_MESSAGE);

    horizontalLineBreakMeasurer = designatedHorizontalLineBreakMeasurer;
}
项目:DigitalMediaServer    文件:SwingUtils.java   
/**
 * Returns the {@link Dimension} for the given {@link JTextComponent}
 * subclass that will show the whole word wrapped text in the given width.
 * It won't work for styled text of varied size or style, it's assumed that
 * the whole text is rendered with the {@link JTextComponent}s font.
 *
 * @param textComponent the {@link JTextComponent} to calculate the {@link Dimension} for
 * @param width the width of the resulting {@link Dimension}
 * @param text the {@link String} which should be word wrapped
 * @return The calculated {@link Dimension}
 */
public static Dimension getWordWrappedTextDimension(JTextComponent textComponent, int width, String text) {
    if (textComponent == null) {
        throw new IllegalArgumentException("textComponent cannot be null");
    }
    if (width < 1) {
        throw new IllegalArgumentException("width must be 1 or greater");
    }
    if (text == null) {
        text = textComponent.getText();
    }
    if (text.isEmpty()) {
        return new Dimension(width, 0);
    }

    FontMetrics metrics = textComponent.getFontMetrics(textComponent.getFont());
    FontRenderContext rendererContext = metrics.getFontRenderContext();
    float formatWidth = width - textComponent.getInsets().left - textComponent.getInsets().right;

    int lines = 0;
    String[] paragraphs = text.split("\n");
    for (String paragraph : paragraphs) {
        if (paragraph.isEmpty()) {
            lines++;
        } else {
            AttributedString attributedText = new AttributedString(paragraph);
            attributedText.addAttribute(TextAttribute.FONT, textComponent.getFont());
            AttributedCharacterIterator charIterator = attributedText.getIterator();
            LineBreakMeasurer lineMeasurer = new LineBreakMeasurer(charIterator, rendererContext);

            lineMeasurer.setPosition(charIterator.getBeginIndex());
            while (lineMeasurer.getPosition() < charIterator.getEndIndex()) {
                lineMeasurer.nextLayout(formatWidth);
                lines++;
            }
        }
    }

    return new Dimension(width, metrics.getHeight() * lines + textComponent.getInsets().top + textComponent.getInsets().bottom);
}
项目:PhET    文件:PStyledText.java   
private ArrayList extractLineBreaks(final AttributedCharacterIterator itr, final LineBreakMeasurer measurer) {
    ArrayList breakList;
    breakList = new ArrayList();
    while (measurer.getPosition() < itr.getEndIndex()) {
        if (constrainWidthToTextWidth) {
            measurer.nextLayout(Float.MAX_VALUE);
        }
        else {
            measurer.nextLayout((float) Math.ceil(getWidth() - insets.left - insets.right));
        }

        breakList.add(new Integer(measurer.getPosition()));
    }
    return breakList;
}
项目:jasperreports    文件:ComplexTextLineWrapper.java   
protected void startParagraph(AttributedCharacterIterator paragraph, boolean truncateAtChar)
{
    this.paragraph = paragraph;
    BreakIterator breakIt = truncateAtChar ? BreakIterator.getCharacterInstance() 
            : BreakIterator.getLineInstance();
    lineMeasurer = new LineBreakMeasurer(paragraph, breakIt, context.getFontRenderContext());
}
项目:jasperreports    文件:ComplexTextLineWrapper.java   
@Override
public TextLine baseTextLine(int index)
{
    AttributedString tmpText = new AttributedString(paragraph, index, index + 1);
    LineBreakMeasurer lbm = new LineBreakMeasurer(tmpText.getIterator(), context.getFontRenderContext());
    TextLayout tlyt = lbm.nextLayout(100);//FIXME what is this? why 100?
    return new TextLayoutLine(tlyt);
}
项目:pumpernickel    文件:DecoratedPanelUIDemo.java   
@Override
public void paint(Graphics g, JComponent c) {
    Graphics2D g2 = (Graphics2D)g.create();
    try {
        if(icon!=null) {
            Dimension d = icon.getPreferredSize(c.getWidth()*3/4, c.getHeight()*3/4);
            icon.paintIcon(c, g2, c.getWidth()/2 - d.width/2, c.getHeight()/2 - d.height/2, d.width, d.height);
        }

        g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
        if(attrString!=null) {
            float y = 0;
            for(int a = 0; a<attrString.length; a++) {
                LineBreakMeasurer lbm = new LineBreakMeasurer(attrString[a].getIterator(), g2.getFontRenderContext());
                TextLayout tl = lbm.nextLayout(c.getWidth());
                while(tl!=null) {
                    y += tl.getAscent();
                    tl.draw(g2, 0, y);
                    y += tl.getDescent() + tl.getLeading();

                    tl = lbm.nextLayout(c.getWidth());
                }
            }
        }

        if(mouseInside) {
            g2.setStroke(new BasicStroke(2, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND, 10, new float[] {4, 4}, 0));
            g2.draw(new Rectangle(0, 0, c.getWidth(), c.getHeight()));
        }
    } finally {
        g2.dispose();
    }
}
项目:pumpernickel    文件:TextBoxPaintable.java   
public TextBoxPaintable(String string,Font font,float maxWidth,float insets,Paint paint) {
    if(paint==null)
        paint = SystemColor.textText;
    this.insets = insets;
    this.text = string;
    this.paint = paint;

    List<String> lines = new ArrayList<String>();
    Map<TextAttribute, Object> attributes = new HashMap<TextAttribute, Object>();
    attributes.put( TextAttribute.FONT, font);
    AttributedString attrString = new AttributedString(string, attributes);
    LineBreakMeasurer lbm = new LineBreakMeasurer( attrString.getIterator(), frc);
    TextLayout tl = lbm.nextLayout(maxWidth);
    float dy = 0;
    GeneralPath path = new GeneralPath();
    int startIndex = 0;
    while(tl!=null) {
        path.append( tl.getOutline( AffineTransform.getTranslateInstance(0, dy) ), false );
        dy += tl.getAscent()+tl.getDescent()+tl.getLeading();
        int charCount = tl.getCharacterCount();
        lines.add( text.substring(startIndex, startIndex+charCount) );
        startIndex += charCount;
        tl = lbm.nextLayout(maxWidth);
    }
    this.lines = lines.toArray(new String[lines.size()]);
    untransformedShape = path;
    Rectangle2D b = ShapeBounds.getBounds(untransformedShape);
    b.setFrame(b.getX(), b.getY(), b.getWidth() + 2*insets, b.getHeight() + 2*insets);
    untransformedBounds = b.getBounds();
}
项目:jdk8u_jdk    文件:TestLineBreakWithFontSub.java   
public void test() {

        // construct a paragraph as follows: MIXED + [SPACING + WORD] + ...
        StringBuffer text = new StringBuffer(MIXED);
        for (int i=0; i < NUM_WORDS; i++) {
            text.append(SPACING);
            text.append(WORD);
        }

        AttributedString attrString = new AttributedString(text.toString());
        attrString.addAttribute(TextAttribute.SIZE, new Float(24.0));

        LineBreakMeasurer measurer = new LineBreakMeasurer(attrString.getIterator(),
                                                           DEFAULT_FRC);

        // get width of a space-word sequence, in context
        int sequenceLength = WORD.length()+SPACING.length();
        measurer.setPosition(text.length() - sequenceLength);

        TextLayout layout = measurer.nextLayout(10000.0f);

        if (layout.getCharacterCount() != sequenceLength) {
            throw new Error("layout length is incorrect!");
        }

        final float sequenceAdvance = layout.getVisibleAdvance();

        float wrappingWidth = sequenceAdvance * 2;

        // now run test with a variety of widths
        while (wrappingWidth < (sequenceAdvance*NUM_WORDS)) {
            measurer.setPosition(0);
            checkMeasurer(measurer,
                          wrappingWidth,
                          sequenceAdvance,
                          text.length());
            wrappingWidth += sequenceAdvance / 5;
        }
    }
项目:jdk8u_jdk    文件:TestLineBreakWithFontSub.java   
/**
 * Iterate through measurer and check that every line is
 * not too long and not too short, but just right.
 */
private void checkMeasurer(LineBreakMeasurer measurer,
                           float wrappingWidth,
                           float sequenceAdvance,
                           int endPosition) {

    do {
        TextLayout layout = measurer.nextLayout(wrappingWidth);
        float visAdvance = layout.getVisibleAdvance();

        // Check that wrappingWidth-sequenceAdvance < visAdvance
        // Also, if we're not at the end of the paragraph,
        // check that visAdvance <= wrappingWidth

        if (visAdvance > wrappingWidth) {
            // line is too long for given wrapping width
            throw new Error("layout is too long");
        }

        if (measurer.getPosition() < endPosition) {
            if (visAdvance <= wrappingWidth - sequenceAdvance) {
                // line is too short for given wrapping width;
                // another word would have fit
                throw new Error("room for more words on line.  diff=" +
                                (wrappingWidth - sequenceAdvance - visAdvance));
            }
        }
    } while (measurer.getPosition() != endPosition);
}
项目:flowable-engine    文件:DefaultProcessDiagramCanvas.java   
public void drawLabel(String text, GraphicInfo graphicInfo, boolean centered) {
    float interline = 1.0f;

    // text
    if (text != null && text.length() > 0) {
        Paint originalPaint = g.getPaint();
        Font originalFont = g.getFont();

        g.setPaint(LABEL_COLOR);
        g.setFont(LABEL_FONT);

        int wrapWidth = 100;
        int textY = (int) graphicInfo.getY();

        // TODO: use drawMultilineText()
        AttributedString as = new AttributedString(text);
        as.addAttribute(TextAttribute.FOREGROUND, g.getPaint());
        as.addAttribute(TextAttribute.FONT, g.getFont());
        AttributedCharacterIterator aci = as.getIterator();
        FontRenderContext frc = new FontRenderContext(null, true, false);
        LineBreakMeasurer lbm = new LineBreakMeasurer(aci, frc);

        while (lbm.getPosition() < text.length()) {
            TextLayout tl = lbm.nextLayout(wrapWidth);
            textY += tl.getAscent();
            Rectangle2D bb = tl.getBounds();
            double tX = graphicInfo.getX();
            if (centered) {
                tX += (int) (graphicInfo.getWidth() / 2 - bb.getWidth() / 2);
            }
            tl.draw(g, (float) tX, textY);
            textY += tl.getDescent() + tl.getLeading() + (interline - 1.0f) * tl.getAscent();
        }

        // restore originals
        g.setFont(originalFont);
        g.setPaint(originalPaint);
    }
}
项目:playn    文件:JavaTextLayout.java   
public static JavaTextLayout[] layoutText (JavaGraphics gfx, String text, TextFormat format,
                                           TextWrap wrap) {
  // normalize newlines in the text (Windows: CRLF -> LF, Mac OS pre-X: CR -> LF)
  text = normalizeEOL(text);

  // we do some fiddling to work around the fact that TextLayout chokes on the empty string
  String ltext = text.length() == 0 ? " " : text;

  // set up an attributed character iterator so that we can measure the text
  AttributedString astring = new AttributedString(ltext);
  if (format.font != null) {
    astring.addAttribute(TextAttribute.FONT, gfx.resolveFont(format.font));
  }

  List<JavaTextLayout> layouts = new ArrayList<JavaTextLayout>();
  FontRenderContext frc = format.antialias ? gfx.aaFontContext() : gfx.aFontContext();
  LineBreakMeasurer measurer = new LineBreakMeasurer(astring.getIterator(), frc);
  int lastPos = ltext.length(), curPos = 0;
  char eol = '\n';
  while (curPos < lastPos) {
    int nextRet = ltext.indexOf(eol, measurer.getPosition()+1);
    if (nextRet == -1) {
      nextRet = lastPos;
    }
    TextLayout layout = measurer.nextLayout(wrap.width, nextRet, false);
    int endPos = measurer.getPosition();
    while (curPos < endPos && ltext.charAt(curPos) == eol)
      curPos += 1; // skip over EOLs
    layouts.add(new JavaTextLayout(ltext.substring(curPos, endPos), format, layout));
    curPos = endPos;
  }
  return layouts.toArray(new JavaTextLayout[layouts.size()]);
}
项目:esadb    文件:GraphicsString.java   
private int getStringWidth(AttributedCharacterIterator s) {
    FontRenderContext fontRenderContext = g.getFontRenderContext();
    LineBreakMeasurer lbm = new LineBreakMeasurer(s, fontRenderContext);
    TextLayout textLayout = lbm.nextLayout(Integer.MAX_VALUE);
    if (textLayout == null) return 0;
    return (int) textLayout.getBounds().getWidth();
}
项目:piccolo2d.java    文件:PStyledText.java   
private ArrayList extractLineBreaks(final AttributedCharacterIterator itr, final LineBreakMeasurer measurer) {
    ArrayList breakList;
    breakList = new ArrayList();
    while (measurer.getPosition() < itr.getEndIndex()) {
        if (constrainWidthToTextWidth) {
            measurer.nextLayout(Float.MAX_VALUE);
        }
        else {
            measurer.nextLayout((float) Math.ceil(getWidth() - insets.left - insets.right));
        }

        breakList.add(new Integer(measurer.getPosition()));
    }
    return breakList;
}
项目:firebird-vizualization-tool    文件:MultilineLayouter.java   
/**
 * Calculates the layout.
 * @param fontRenderContext the FontRenderContext
 * @param font the Font
 * @param text the text
 * @param layoutWidth the width of the layout area
 * @return the layout result
 */
public MultilineLayout calculateLayout(FontRenderContext fontRenderContext,
  Font font, String text, double layoutWidth) {
  // Layout multiline text
  MultilineLayout result = new MultilineLayout();
  if (text == null || text.isEmpty()) return result;
  Map<TextAttribute, Object> styleMap = new HashMap<TextAttribute, Object>();
  styleMap.put(TextAttribute.FONT, font);
  String[] textlines = text.split("\n");
  double height = 0;
  for (String textline : textlines) {
    AttributedString attribText = new AttributedString(textline, styleMap);
    AttributedCharacterIterator iter = attribText.getIterator();
    int textStart = iter.getBeginIndex();
    int textEnd = iter.getEndIndex();
    LineBreakMeasurer measurer = new LineBreakMeasurer(iter,
      fontRenderContext);
    measurer.setPosition(textStart);
    while (measurer.getPosition() < textEnd) {
      TextLayout line = measurer.nextLayout((float) layoutWidth);
      result.addLine(line);
      height += (line.getAscent() + line.getDescent() + line.getLeading());
    }
  }
  result.setSize(layoutWidth, height);
  return result;
}
项目:calao    文件:RoundedButton.java   
double getWidthOfAttributedString(Graphics2D graphics2D, AttributedString attributedString) {
    AttributedCharacterIterator characterIterator = attributedString.getIterator();
    FontRenderContext fontRenderContext = graphics2D.getFontRenderContext();
    LineBreakMeasurer lbm = new LineBreakMeasurer(characterIterator, fontRenderContext);
    TextLayout textLayout = lbm.nextLayout(Integer.MAX_VALUE);
    return textLayout.getBounds().getWidth();
}
项目:zgrnbviewer    文件:MultilineText.java   
public MultilineText(String text) {
    super(text);
    atText = new AttributedString(text);
    atText.addAttribute(TextAttribute.FONT,
                        usesSpecificFont() ? getFont() : getMainFont());
    lbm = new LineBreakMeasurer(atText.getIterator(), DEFAULT_FRC);
}
项目:SOEN6471-FreeCol    文件:FreeColToolTipUI.java   
public void paint(Graphics g, JComponent c) {
   if (c.isOpaque()) {
       ImageLibrary.drawTiledImage("background.FreeColToolTip", g, c, null);
   }

   // TODO: find out why this is necessary
   g.setColor(Color.BLACK);
   Graphics2D graphics = (Graphics2D) g;

   float x = margin;
   float y = margin;
   for (String line : lineBreak.split(((JToolTip) c).getTipText())) {
       AttributedCharacterIterator styledText =
           new AttributedString(line).getIterator();

       LineBreakMeasurer measurer = new LineBreakMeasurer(styledText, frc);

       while (measurer.getPosition() < styledText.getEndIndex()) {

           TextLayout layout = measurer.nextLayout(maximumWidth);

           y += (layout.getAscent());
           float dx = layout.isLeftToRight() ?
               0 : (maximumWidth - layout.getAdvance());

           layout.draw(graphics, x + dx, y);
           y += layout.getDescent() + layout.getLeading();
       }
   }
}
项目:pdfxtk    文件:TextArea.java   
void rescale(double scale) {
     Rectangle bounds = getBounds(scale);

     HashMap settings = new HashMap();
     settings.put(TextAttribute.FONT, new Font(style.getFontAttributes(scale)));

     AttributedCharacterIterator par = (new AttributedString(element.getAttribute("text"), settings)).getIterator();
     LineBreakMeasurer lbm = new LineBreakMeasurer(par, new FontRenderContext(null, false, false));

     ArrayList drawList = new ArrayList();

     int parEnd   = par.getEndIndex();

     int positionX;
     int positionY = bounds.y;
     lbm.setPosition(par.getBeginIndex());
     while (lbm.getPosition() < parEnd) {
TextLayout layout = lbm.nextLayout(bounds.width);
positionX = bounds.x;
if (!layout.isLeftToRight()) {
  positionX += bounds.width - (int) layout.getAdvance();
}
positionY += layout.getAscent();
if (positionY > bounds.y+bounds.height) break;
drawList.add(new Point(positionX, positionY));
drawList.add(layout);
positionY += layout.getDescent() + layout.getLeading();
     }

     textPositions = new Point[drawList.size()/2];
     textLines     = new TextLayout[drawList.size()/2];
     textScale     = scale;

     for (int i = 0; i < textPositions.length; i++) {
textPositions[i] = (Point)      drawList.get(i*2);
textLines[i]     = (TextLayout) drawList.get(i*2+1);
     }
   }
项目:pdfxtk    文件:TextArea.java   
void rescale(double scale) {
     Rectangle bounds = getBounds(scale);

     HashMap settings = new HashMap();
     settings.put(TextAttribute.FONT, new Font(style.getFontAttributes(scale * Integer.parseInt(element.getAttribute("size")))));

     AttributedCharacterIterator par = (new AttributedString(element.getAttribute("text"), settings)).getIterator();
     LineBreakMeasurer lbm = new LineBreakMeasurer(par, new FontRenderContext(null, false, false));

     ArrayList drawList = new ArrayList();

     int parEnd   = par.getEndIndex();

     int positionX;
     int positionY = bounds.y;
     lbm.setPosition(par.getBeginIndex());
     while (lbm.getPosition() < parEnd) {
TextLayout layout = lbm.nextLayout(bounds.width);
positionX = bounds.x;
if (!layout.isLeftToRight()) {
  positionX += bounds.width - (int) layout.getAdvance();
}
positionY += layout.getAscent();
if (positionY > bounds.y+bounds.height) break;
drawList.add(new Point(positionX, positionY));
drawList.add(layout);
positionY += layout.getDescent() + layout.getLeading();
     }

     textPositions = new Point[drawList.size()/2];
     textLines     = new TextLayout[drawList.size()/2];
     textScale     = scale;

     for (int i = 0; i < textPositions.length; i++) {
textPositions[i] = (Point)      drawList.get(i*2);
textLines[i]     = (TextLayout) drawList.get(i*2+1);
     }
   }
项目:litiengine    文件:SpeechBubble.java   
private void createBubbleImage() {

    final BufferedImage img = ImageProcessing.getCompatibleImage(500, 500);
    final Graphics2D g = img.createGraphics();
    g.setFont(this.font);
    final int stringWidth = g.getFontMetrics().stringWidth(this.currentText);
    if (stringWidth < this.textBoxWidth) {
      this.textBoxWidth = stringWidth;
    }

    final FontRenderContext frc = g.getFontRenderContext();
    final AttributedString styledText = new AttributedString(this.currentText);
    styledText.addAttribute(TextAttribute.FONT, this.font);
    final AttributedCharacterIterator iterator = styledText.getIterator();
    final LineBreakMeasurer measurer = new LineBreakMeasurer(iterator, frc);
    measurer.setPosition(0);
    float y = 0;
    while (measurer.getPosition() < this.currentText.length()) {
      final TextLayout layout = measurer.nextLayout(this.textBoxWidth);
      y += layout.getAscent() + layout.getLeading() + 0.2;
    }

    final RoundRectangle2D bounds = new RoundRectangle2D.Double(0, 0, this.textBoxWidth + 2 * PADDING, y + 2 * PADDING, PADDING, PADDING);

    // Build a path
    final GeneralPath path = new GeneralPath();
    path.moveTo(bounds.getWidth() / 2.0 - TRIANGLE_SIZE / 2.0, bounds.getHeight());
    path.lineTo(bounds.getWidth() / 2.0, bounds.getHeight() + TRIANGLE_SIZE);
    path.lineTo(bounds.getWidth() / 2.0 + TRIANGLE_SIZE / 2.0, bounds.getHeight());
    path.closePath();

    final Area ar = new Area(bounds);
    ar.add(new Area(path));

    int width = ar.getBounds().width;
    this.height = ar.getBounds().height;
    g.setColor(SPEAK_BACKGROUNDCOLOR);
    g.fill(ar);

    g.setColor(SPEAK_BORDERCOLOR);
    g.draw(ar);
    g.dispose();

    this.bubble = ImageProcessing.crop(img, ImageProcessing.CROP_ALIGN_LEFT, ImageProcessing.CROP_VALIGN_TOP, width + 1, this.height + 1);
  }