2012-03-06 7 views
1

Может ли кто-нибудь помочь мне найти способ масштабировать строку/символ в Java (Graphics2D), чтобы точно соответствовать прямоугольнику заданного размера (так, чтобы он касался прямоугольника от внутри)?Scale String в Java для размещения прямоугольника внутри

Это то, что я до сих пор:

String s = "S"; // always a single character! 
Rectangle rect = getRect(); // defines the desired size and position 
AffineTransform transform = new AffineTransform(); 
transform.setToTranslation(rect.getX(), rect.getY()); 
transform.scale(rect.getWidth()/(double) fm.stringWidth(s), 
       rect.getHeight()/(double) fm.getAscent()); 
FontRenderContext frc = image.getFontRenderContext(); 
TextLayout tl = new TextLayout(s, g2d.getFont(), frc); 
Shape shape = tl.getOutline(transform); 
g2d.setClip(shape); 
g2d.fill(shape.getBounds()); 

Проблема я работает этот код является то, что хотя строка масштабируется прямоугольники размером примерно, это не соответствует его точно, т.е. , он не касается границ прямоугольников изнутри (это то, что я хочу, чтобы он делал!).

Помогает ли это использовать другой шрифт? На данный момент я использую моноширинный шрифт. Или, мне нужно делать масштабирование по-другому?

Благодарим за помощь!

+0

Почему вы не используете графическую инфраструктуру, такую ​​как Swing? –

+0

Я просто рисую изображение для веб-приложения. Знаете ли вы, что это простое решение для Swing? – Tobieh

+0

Извините, я не очень внимательно изучил вопрос. Я думаю, вам придется поиграть с индивидуальным интервалом между символами, чтобы он точно касался краев окна. –

ответ

3

я придумал, как сделать то, что я хочу сделать, и думал, что я мог бы поделиться:

Моя главная задача была высота различных символов, так что вместо использования всплытие шрифт, я использовал его максимальные и минимальные Y-координаты для расчета его высоты. Смотри ниже.

String s = "S"; // always a single character! 
Rectangle rect = getRect(); // defines the desired size and position 
FontMetrics fm = g2d.getFontMetrics(); 
FontRenderContext frc = g2d.getFontRenderContext(); 
TextLayout tl = new TextLayout(s, g2d.getFont(), frc); 
AffineTransform transform = new AffineTransform(); 
transform.setToTranslation(rect.getX(), rect.getY()); 
double scaleY = 
    rect.getHeight()/(double) (tl.getOutline(null).getBounds().getMaxY() 
           - tl.getOutline(null).getBounds().getMinY()); 
transform.scale(rect.getWidth()/(double) fm.stringWidth(s), scaleY); 
Shape shape = tl.getOutline(transform); 
g2d.setClip(shape); 
g2d.fill(shape.getBounds()); 

Я надеюсь, что это поможет кому-то с подобной проблемой!