gpt4 book ai didi

java - 字符串宽度错误

转载 作者:行者123 更新时间:2023-11-29 08:05:51 29 4
gpt4 key购买 nike

我有以下用于计算对话框标题宽度的代码。

FontRenderContext frc = new FontRenderContext(null, true, true);
TextLayout tl = new TextLayout(getTitle(), getFont(), frc);
double w = tl.getPixelBounds(null, 0, 0).getWidth();

但是由于某些原因文本宽度计算错误。我检查了这段用于计算单选按钮标签文本宽度的代码,它工作正常。我主要关心的是对话框字体,我不确定我是否正确理解了它。

例如,对于标题 test,计算出的宽度是 20,但实际宽度是 23。字符串越长,计算宽度和实际宽度之间的差异就越大。

最佳答案

您得到了错误的结果,因为对话框标题和它使用的字体是 native 资源。

如果您的应用程序仅适用于 Windows,您可以使用以下代码获取宽度:

Font f = (Font)Toolkit.getDefaultToolkit().getDesktopProperty("win.frame.captionFont");  
Graphics gr = getGraphics();
FontMetrics metrics = gr.getFontMetrics(f);
int width = metrics.stringWidth(getTitle());

否则尝试从标题栏的字体中获取 FontMetrics:

Container titleBar = (Container) dialog.getLayeredPane().getComponents()[1];
FontMetrics metrics = titleBar.getFontMetrics(titleBar.getFont());
int width = metrics.stringWidth(getTitle());

如果是动态设置对话框的宽度,还需要考虑LaF间距和边框。试试这个:

// This is the space inserted on the left of the title, 5px in Metal LaF
width += 5;

// This is the space for the close button, LaF dependent.
width += 4;

// Add the borders
width += dialog.getWidth() - dialog.getContentPane().getWidth();

// Finally set the size
dialog.setSize(new Dimension(width, dialog.getPreferredSize().height));

希望这会奏效。如果您想知道这些数字从何而来,它们在 JDK source code 中。 .

关于java - 字符串宽度错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11309243/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com