Java中如何获取真实的字符串高度?

2024-04-11

我在用着FontMetrics.getHeight()获取字符串的高度,但它给了我一个错误的值,切断了字符串字符的下降部分。有更好的功能我可以使用吗?


The getStringBounds()下面的方法是基于GlyphVector对于当前的Graphics2D字体,对于一行文本字符串非常有效:

public class StringBoundsPanel extends JPanel
{
    public StringBoundsPanel()
    {
        setBackground(Color.white);
        setPreferredSize(new Dimension(400, 247));
    }

    @Override
    protected void paintComponent(Graphics g)
    {
        super.paintComponent(g);

        Graphics2D g2 = (Graphics2D) g;

        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                            RenderingHints.VALUE_ANTIALIAS_ON);

        // must be called before getStringBounds()
        g2.setFont(getDesiredFont());

        String str = "My Text";
        float x = 140, y = 128;

        Rectangle bounds = getStringBounds(g2, str, x, y);

        g2.setColor(Color.red);
        g2.drawString(str, x, y);

        g2.setColor(Color.blue);
        g2.draw(bounds);

        g2.dispose();
    }

    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);
    }

    private Font getDesiredFont()
    {
        return new Font(Font.SANS_SERIF, Font.BOLD, 28);
    }

    private void startUI()
    {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(this);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(String[] args) throws Exception
    {
        final StringBoundsPanel tb = new StringBoundsPanel();

        SwingUtilities.invokeAndWait(new Runnable()
        {
            public void run()
            {
                tb.startUI();
            }
        });
    }
}

请注意,为了清楚起见,我省略了导入。

结果:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java中如何获取真实的字符串高度? 的相关文章

随机推荐

  • Sequelize v6 从目录下的文件加载模型

    在 Sequelize v5 或更早版本中 有一种方法可以使用以下命令从文件加载模型sequelize import功能 import Sequelize from sequelize let sequelize new Sequelize
  • Doobie - 将任意效果提升到 ConnectionIO 中

    我正在尝试在使用 Doobie 将用户插入数据库的同一事务中发送电子邮件 我知道我可以举起IO into ConnectionIO通过使用Async ConnectionIO liftIO catsIO where catsIO IO St
  • 选择Python后立即选择选项菜单

    我想知道是否有任何方法可以查看用户在显示的列表中选择的内容 比方说 Apple Orange Grapes 在他们选择其中之一之后 就像当用户单击选项框并单击 Apple 时 Tkinter 将返回一些内容 然后 如果他将选择切换为橙色 那
  • 如何使用 foreach 克服内存限制

    我正在尝试处理保存在磁盘上的 gt 10000 个 xts 对象 当加载到 R 中时 每个对象的大小约为 0 2 GB 我想使用 foreach 并行处理这些对象 我的代码适用于类似 100 个 xts 对象的情况 我将这些对象预加载到内存
  • 使用 TabHost 和 LocalActivityManager 时未调用 Android OnResume

    我设置了一个包含两个活动的 tabhost 由于我无法使用 TabActivity 所以我使用了 LocalActivityManager 但是当我切换选项卡时 不会为选项卡内的活动调用 onResume 这是我的设置 mlam new L
  • 如何从 model+ModelForm 获取文本区域?

    模型 py gt from django db import models from django forms import ModelForm from datetime import date import datetime from
  • 如何在 bash 中转义用户输入变量中的正斜杠?

    我正在编写一个脚本 以便更有效地设置静态站点 我遇到的问题是我用来替换文件中字符串的变量具有未转义的正斜杠并且是用户输入 我怎样才能确保 site url http statamic com会变成 site url http example
  • 为什么如果我在 Scala 中扩展 App 特征,我会重写 main 方法?

    所以我读到 App 特征具有以下字段 def delayedInit body Unit Unit val executionStart Long def main args Array String Unit 我知道 如果一个特征只有一种
  • Rails:rake db:migrate 在 Oracle 上*非常*慢

    我正在使用 Railsoracleenhanced适配器为遗留应用程序创建新接口 数据库迁移工作成功 但在 rake 完成之前需要非常长的时间 数据库更改发生得非常快 1 或 2 秒 但是db schema db转储需要一个多小时才能完成
  • torchvision.transforms.Normalize 是如何操作的?

    我不明白如何标准化Pytorch works 我想将平均值设置为0和标准差1跨越张量中的所有列x形状的 2 2 3 一个简单的例子 gt gt gt x torch tensor 1 2 3 4 5 6 7 8 9 10 11 12 gt
  • AttributeError: 'NoneType' 对象没有属性 'text' ,我不明白如何修复它

    我正在尝试使用 python 读取文件并将每一行作为函数的参数 我收到 AttributeError NoneType object has no attribute text 错误 我不明白如何修复它 from bs4 import Be
  • 在MPAndroidChart中,如何为Barchart中的每个Bar添加点击事件?

    我使用 MPAndroidChart 库来实现Barchart 如何实现中每个bar的点击监听Barchart 我想显示点击的barToast 中的值 如何实现这一点 mChart BarChart findViewById R id ch
  • 将简单类型语言的非类型 AST 转换为 GADT

    我有一个代表简单语言 AST 的 ADT data UTerm UTrue UFalse UIf UTerm UTerm UTerm UZero USucc UTerm UIsZero UTerm 该数据结构可以表示不遵循类型的无效术语 语
  • 如何根据任务或任务集切换用户?

    我的 ansible 手册中反复出现的主题是我经常必须使用 sudo 权限执行命令 sudo yes 因为我想为某个用户执行此操作 理想情况下 我宁愿使用 sudo 切换到该用户并正常执行命令 因为这样我就不必执行通常的后命令清理工作 例如
  • 具有可变参数数量的 OCaml 函数

    我正在探索 OCaml 函数的 高级 用法 我想知道如何编写具有可变数量参数的函数 例如 像这样的函数 let sum x1 x2 x3 xn x1 x2 x3 xn 通过一些类型黑客 当然 let sum f f 0 let arg x
  • 从“.exe”+偏移量读取内存?

    我正在使用 WinAPIReadProcessMemory 从游戏中读取一些 隐藏 信息 我已经使用 Cheat Engine 找出静态指针 但我不知道如何读取它们 Cheat Engine 给了我一个类似这样的指针 mygame exe
  • 在一个 Eclipse 项目中集成 Java 和 Python 代码

    我正在使用 Eclipse 和 PyDev 用 Python 编写一个编译器 我已经到了需要用 Java 编写一些代码的阶段 我在想是否有办法将它们合并到一个项目中 因为目前我有两个独立的项目 每当我需要更改Java代码时 我都必须手动将
  • 当我尝试运行测试时,为什么会收到“分段错误”错误?

    我编写了一个函数来确定是否分配默认值 如果标志不存在 它分配默认值 如果标志存在 它分配用户传递的值 我正在尝试用字符串测试我的函数 看看它是否确实给了我正确的数字 当我尝试运行测试时 我不断收到 分段错误 它可以编译 但测试就是不起作用
  • Python 中列表的切片

    我需要对列表列表进行切片 A 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 idx slice 0 4 B A idx 上面的代码没有给我正确的输出 我想要的是 1 2 3 1 2 3 1 2 3 使用切片对象很少比使用列表理
  • Java中如何获取真实的字符串高度?

    我在用着FontMetrics getHeight 获取字符串的高度 但它给了我一个错误的值 切断了字符串字符的下降部分 有更好的功能我可以使用吗 The getStringBounds 下面的方法是基于GlyphVector对于当前的Gr