2016-10-31 44 views
0

我使用此方法测量Swing图形中的文本边界 但它并未覆盖整个文本。 它在测量身高时特别不好... 当我输入英文文本时它会变得更好,但我应该使用波斯语字体。在Swing Graphics2d中测量文本边界

texts and bounds image

private Rectangle getStringBounds(Graphics2D g2, String str, 
            float x, float y) 
{ 
    FontRenderContext frc = g2.getFontRenderContext(); 
    GlyphVector gv = g2.getFont().createGlyphVector(frc, str); 
    return gv.getPixelBounds(null, x, y); 
} 

我这是怎么绘制文本和边界:

g.drawString(text, x-textBounds.width/2, y+textBounds.height/2); 
g.drawRect(x-textBounds.width/2, y-textBounds.height/2, textBounds.width, textBounds.height); 
+0

你错过了偏移。你尝试过使用'gv.getVisualBounds'吗?你是怎么显示矩形/文本的?你能否包括一段你想修改的文字? – matt

+0

@matt“你怎么显示矩形/文本?”我编辑了这篇文章并添加了我做到的方式......“您是否尝试过使用gv.getVisualBounds?” gv.getVisualBounds也会得到错误的高度并且存在相同的问题... –

+0

您可以添加一段文本,对于我来说,获取可视边界封装了包括文字在内的文字,该文字低于基线。 – matt

回答

2

这里有两种方式来获得完整的字体。我只是从互联网上抓取了一些随机的波斯语文本,因为OP不会费心去粘贴一个小例子。

public class BoxInFont { 
    String text = "سادگی، قابلیت تبدیل"; 
    int ox = 50; 
    int oy = 50; 
    void buildGui(){ 
     JFrame frame = new JFrame("Boxed In Fonts"); 

     JPanel panel = new JPanel(){ 
      @Override 
      protected void paintComponent(Graphics g){ 
       super.paintComponent(g); 
       Graphics2D g2d = (Graphics2D)g; 
       g.drawString(text, ox, oy); 
       Font f = g.getFont(); 
       Rectangle2D charBounds = f.getStringBounds(text, g2d.getFontRenderContext()); 
       GlyphVector gv = f.layoutGlyphVector(g2d.getFontRenderContext(), text.toCharArray(), 0, text.length(), GlyphVector.FLAG_MASK); 
       Rectangle2D bounds = gv.getVisualBounds(); 
       g2d.translate(ox, oy); 
       //g2d.drawRect((int)bounds.getX() + ox, (int)bounds.getY() + oy, (int)bounds.getWidth(), (int)bounds.getHeight()); 
       g2d.draw(bounds); 
       g2d.draw(charBounds); 
       System.out.println("vis: " + bounds); 
       System.out.println("char: " + charBounds); 
      } 
     }; 
     frame.add(panel); 
     frame.setSize(400, 400); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setVisible(true); 
    } 


    public static void main(String[] args){ 

     EventQueue.invokeLater(()->new BoxInFont().buildGui()); 

    } 
} 

这两个被绘制的框完全封装了文本。我认为视觉边界更紧密。

OP在做什么的问题,他们忽略了返回的矩形的x和y值。他们只使用宽度和高度。如果你看一下这个程序的输出,你可以看到,x和y不为0

可见: java.awt.geom.Rectangle2D中的$浮法[X = -0.2056962,Y = -9.814648 ,W = 96.76176,H = 13.558318] 字符: java.awt.geom.Rectangle2D中的$浮法[X = 0.0,Y = -12.568359,W = 97.0,H = 15.310547]

+0

它工作正常......谢谢:) –