【问题标题】:Fonts - How to position top-left corner of a string?字体 - 如何定位字符串的左上角?
【发布时间】:2015-06-25 21:46:38
【问题描述】:

假设我想使用java.awt.Graphics.drawString(String str, int x, int y) 方法在某个特定坐标处绘制一个字符串,例如 (300, 300)。但是,drawString() 方法将始终将 字符串的左下角 定位在这些坐标处,而不是我想要的左上角。

在指定坐标处绘制字符串左上角的简单方法是什么?我知道java.awt.FontMetrics 实用程序类,但很确定它是否有用。

【问题讨论】:

    标签: java swing fonts


    【解决方案1】:

    试试这个:

    FontMetrics metric = g.getFontMetrics(g.getFont());
    g.drawString(str, x, y + metric.getAscent() - metric.getDescent() - metric.getLeading());
    

    【讨论】:

    • 您是否确认这是一个完美的解决方案,即适用于所有字体?
    • 不,但从getAscentgetDescentgetLeading 的定义来看,这似乎是合法的。
    • 这会将字符串从参考点“向上”移动。我认为这不是 OP 想要的。
    • @laune 将其向下移动,以便原点位于绘制字符串的左上角。从我使用默认字体的测试来看,这比接受的答案(如果我正确理解 OP 想要什么)效果更好。记住更大的 y = 更低。
    【解决方案2】:

    FontMetrics 是要使用的类:

    public static int getStringAscent(Graphics page, Font f, String s) {
        // Find the size of string s in the font of the Graphics context "page"
        FontMetrics fm   = page.getFontMetrics(f);
        return fm.getAscent();
    }
    

    上升是给定字符串从基线上升的最大高度。基线的起点是 drawString 方法的参考点,因此上升是您必须调整坐标的距离。如果您使用它来使用 Graphics2D g 绘制字符串:

    g.drawString(msg, x, y);
    

    您可以将其向下移动字体 f 的上升高度:

    Font small = new Font("Helvetica", Font.BOLD, 24);
    FontMetrics metrics = getFontMetrics(small);
    int d = metrics.getAscent();
    
    g.drawString(msg, x, y + d );
    

    【讨论】:

      猜你喜欢
      • 2011-01-02
      • 2021-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-25
      • 2010-10-17
      • 1970-01-01
      • 2013-10-04
      相关资源
      最近更新 更多