2015-03-22 2 views
0

У меня есть объект GUIText, который имеет строковый текст, шрифт, стиль шрифта, цвет и декор (подчеркивание, надпись, зачеркивание). Я могу использовать этот метод, чтобы получить ширину GUIText, в соответствии с его текстом и шрифтом:Java - Точная высота шрифта без графики

public int getWidth() { 
    return Display.getCanvas().getFontMetrics(this.font.toJavaFont()).stringWidth(
      this.text); 
} 

(Display.getCanvas() возвращает JComponent).
Я знаю о getFontMetrics(). GetHeight(), но это возвращает число слишком большое. На самом деле font.getSize() ближе к фактической высоте, чем getFontMetrics(). GetHeight(), но не является точным. Мне нужно это знать, поэтому я могу нарисовать линию над GUIText для украшения сверху.

+0

FontMetrics # GetHeight будет возвращать общую высоту шрифта (от heightest до самой низкой точки шрифта), если нет, то это обычно означает, что шрифт не предоставление правильной метрической информации – MadProgrammer

+0

Вы также должны ознакомиться с [Работа с текстовыми API-интерфейсами] (http://docs.oracle.com/javase/tutorial/2d/text/index.html) для получения дополнительной информации о том, как шрифты измеренные и рендереры – MadProgrammer

ответ

2

Возможно, класс TextLayout - это то, что вы ищете. Это даст вам точный размер:

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

public class DrawTest extends JPanel 
{ 
    String text; 

    public DrawTest(String text) 
    { 
     this.text = text; 
     setFont(new Font("Arial", Font.PLAIN, 24)); 
    } 

    public void paintComponent(Graphics g) 
    { 
     super.paintComponent(g); 
     Graphics2D g2d = (Graphics2D)g; 
     g2d.setFont(getFont()); 
     g2d.setPaint(Color.RED); 

     // Draw text using FontMetrics 

     FontMetrics fm = g2d.getFontMetrics(); 
     Rectangle2D rect = fm.getStringBounds(text, g2d); 
     rect.setRect(rect.getX() + 100, rect.getY() + 50, rect.getWidth(), rect.getHeight()); 
     g2d.draw(rect); 

     // Draw text using TextLayout 

     g2d.setPaint(Color.BLACK); 

     Point2D loc = new Point2D.Float(100, 50); 
     FontRenderContext frc = g2d.getFontRenderContext(); 
     TextLayout layout = new TextLayout(text, getFont(), frc); 
     layout.draw(g2d, (float)loc.getX(), (float)loc.getY()); 

     Rectangle2D bounds = layout.getBounds(); 
     bounds.setRect(bounds.getX()+loc.getX(), bounds.getY()+loc.getY(), bounds.getWidth(), bounds.getHeight()); 
     g2d.draw(bounds); 
    } 

    private static void createAndShowUI() 
    { 
     DrawTest text = new DrawTest("This is some ugly test"); 

     JFrame frame = new JFrame("SSCCE"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(text); 
     frame.setSize(400, 200); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) 
    { 
     EventQueue.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       createAndShowUI(); 
      } 
     }); 
    } 
} 
+0

У меня нет доступа к объекту Graphics – MCMastery

+1

@MCMastery, как вы ожидаете «нарисовать линию ...», если у вас нет объекта Graphics? – camickr

+0

Когда я рисую линию, у меня она есть. – MCMastery

Смежные вопросы