【问题标题】:String length in pixels in JavaJava中的字符串长度(以像素为单位)
【发布时间】:2012-10-31 23:52:19
【问题描述】:

在给定特定java.awt.Font 对象且不使用任何GUI 组件的情况下,有没有办法以像素为单位计算字符串的长度?

【问题讨论】:

  • 另请参阅this answer 以使用GlyphVector。它将最终图像放入 GUI 中,但这只是为了显示它。

标签: java string fonts awt fontmetrics


【解决方案1】:

不使用任何 GUI 组件?

这取决于你在这里的意思。我假设你的意思是你想在没有收到HeadlessException 的情况下这样做。

最好的方法是使用BufferedImage。 AFAIK,这不会抛出HeadlessException

Font font = ... ;
BufferedImage img = new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB);
FontMetrics fm = img.getGraphics().getFontMetrics(font);
int width = fm.stringWidth("Your string");

除了使用这样的东西,我认为你不能。您需要一个图形上下文来创建 FontMetrics 并为您提供字体大小信息。

【讨论】:

    【解决方案2】:

    您可以使用Graphics2D 对象来获取字体边界(包括宽度):

    Graphics2D g2d = ...
    Font font = ...
    Rectangle2D f = font.getStringBounds("hello world!", g2d.getFontRenderContext());
    

    但这取决于您将如何获取Graphics2D 对象(例如来自Image)。

    【讨论】:

    • 我认为这算是一个 GUI 组件。
    • @GlenLamb 我不同,Image 不是 GUI 组件。
    • 我同意,但是在没有 GUI 组件的情况下执行此操作的具体需求通常意味着 awt,否则该要求没有什么意义。
    • @GlenLamb 我不明白你在说什么。 Graphics2D 可能是从 Brian 的代码中的 img.getGraphics()(或者更确切地说是 img.createGraphics())获得的。
    • @dacwe 为什么要指定“没有 GUI 组件”,除非需要避免使用 awt Graphics2d?因为这几乎就是你要做的事情,即使你使用的是 GUI。
    【解决方案3】:

    这为我提供了 (137.0, 15.09375) 的输出。我不知道单位是什么,但它看起来确实按比例正确,并且不直接使用 Graphics2D。

        Font f = new Font("Ariel", Font.PLAIN, 12);
        Rectangle2D r = f.getStringBounds("Hello World! Hello World!", new FontRenderContext(null, RenderingHints.VALUE_TEXT_ANTIALIAS_DEFAULT, RenderingHints.VALUE_FRACTIONALMETRICS_DEFAULT));
        System.out.println("(" + r.getWidth() + ", " + r.getHeight() + ")"); 
    

    【讨论】:

      【解决方案4】:

      我需要在调用paintComponent 之前获取字符串的长度和宽度,以便我可以根据文本尺寸调整封闭面板的大小。这些技术都没有提供足够的宽度,而且我没有可用的 Graphics 对象。我通过将字体设置为“等宽”解决了这个问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-07-16
        • 1970-01-01
        • 1970-01-01
        • 2015-03-05
        • 1970-01-01
        • 1970-01-01
        • 2010-10-01
        相关资源
        最近更新 更多