2008-11-03 2 views
72

Как рассчитать длину (в пикселях) строки в Java?Вычислить ширину отображения строки в Java

Предпочтительно без использования Свинг.

EDIT: Я хотел бы нарисовать строку с помощью drawString() в Java2D и использовать длину для переноса слов.

+4

Без свинга? Какое устройство вы используете? Какой шрифт? Какой размер? Какой стиль? Все это меняет ширину экрана. – 2008-11-03 12:31:56

+1

@S. Лотт. У вас есть это в одном. У меня возникло соблазн закрыть это как вопрос. – 2008-11-03 12:34:01

+1

@David Arno: Я - softie на n00bz. Я добавлю тег [beginner]. – 2008-11-03 12:39:01

ответ

108

Если вы просто хотите использовать AWT, а затем использовать Graphics.getFontMetrics (опционально указать шрифт, для не по умолчанию один), чтобы получить FontMetrics, а затем FontMetrics.stringWidth найти ширину указанной строки.

Например, если у вас есть Graphics переменной g, вы будете использовать:

int width = g.getFontMetrics().stringWidth(text); 

Для других наборов инструментов, вы должны дать нам больше информации - это всегда будет набором инструментов в зависимости от ,

38

Это не всегда нужно быть зависящим от инструментария, или не всегда нужно использовать подход FontMetrics, так как он требует, чтобы сначала получить графический объект, отсутствующий в веб-контейнере или в безголовой среде.

Я тестировал это в веб-сервлете, и он вычисляет ширину текста.

import java.awt.Font; 
import java.awt.font.FontRenderContext; 
import java.awt.geom.AffineTransform; 

... 

String text = "Hello World"; 
AffineTransform affinetransform = new AffineTransform();  
FontRenderContext frc = new FontRenderContext(affinetransform,true,true);  
Font font = new Font("Tahoma", Font.PLAIN, 12); 
int textwidth = (int)(font.getStringBounds(text, frc).getWidth()); 
int textheight = (int)(font.getStringBounds(text, frc).getHeight()); 

Добавьте необходимые значения этих размеров, чтобы создать любой необходимый запас.

7

Используйте метод GetWidth в следующем классе:

import java.awt.*; 
import java.awt.geom.*; 
import java.awt.font.*; 

class StringMetrics { 

    Font font; 
    FontRenderContext context; 

    public StringMetrics(Graphics2D g2) { 

    font = g2.getFont(); 
    context = g2.getFontRenderContext(); 
    } 

    Rectangle2D getBounds(String message) { 

    return font.getStringBounds(message, context); 
    } 

    double getWidth(String message) { 

    Rectangle2D bounds = getBounds(message); 
    return bounds.getWidth(); 
    } 

    double getHeight(String message) { 

    Rectangle2D bounds = getBounds(message); 
    return bounds.getHeight(); 
    } 

} 
0

лично я искал что-то, чтобы позволить мне вычислить многострочную область строки, так что я мог определить, если данная область является достаточно большой, чтобы напечатать строку - с сохранением определенного шрифта.

Я надеюсь, что это будет безопасно некоторое время к другому парню, который, возможно, захочет сделать аналогичную работу в Java так что просто хотел поделиться решение:

private static Hashtable hash = new Hashtable(); 
private Font font; 
private LineBreakMeasurer lineBreakMeasurer; 
private int start, end; 

public PixelLengthCheck(Font font) { 
    this.font = font; 
} 

public boolean tryIfStringFits(String textToMeasure, Dimension areaToFit) { 
    AttributedString attributedString = new AttributedString(textToMeasure, hash); 
    attributedString.addAttribute(TextAttribute.FONT, font); 
    AttributedCharacterIterator attributedCharacterIterator = 
      attributedString.getIterator(); 
    start = attributedCharacterIterator.getBeginIndex(); 
    end = attributedCharacterIterator.getEndIndex(); 

    lineBreakMeasurer = new LineBreakMeasurer(attributedCharacterIterator, 
      new FontRenderContext(null, false, false)); 

    float width = (float) areaToFit.width; 
    float height = 0; 
    lineBreakMeasurer.setPosition(start); 

    while (lineBreakMeasurer.getPosition() < end) { 
     TextLayout textLayout = lineBreakMeasurer.nextLayout(width); 
     height += textLayout.getAscent(); 
     height += textLayout.getDescent() + textLayout.getLeading(); 
    } 

    boolean res = height <= areaToFit.getHeight(); 

    return res; 
} 
Смежные вопросы