Java 如何计算标签的最大适合字体大小?
我有一个Java 如何计算标签的最大适合字体大小?,java,linux,eclipse,swt,jface,Java,Linux,Eclipse,Swt,Jface,我有一个画布,其中包含一个标签。我想根据画布大小设置此标签的字体大小。 我们如何做到这一点 编辑:“包含”表示画布和标签边界相同 EDIT2:我有这个Swing,但是我不能把它转换成SWT Font labelFont = label.getFont(); String labelText = label.getText(); int stringWidth = label.getFontMetrics(labelFont).stringWidth(labelText); int compone
画布
,其中包含一个标签
。我想根据画布大小设置此标签的字体大小。
我们如何做到这一点
编辑:“包含”表示画布和标签边界相同
EDIT2:我有这个Swing,但是我不能把它转换成SWT
Font labelFont = label.getFont();
String labelText = label.getText();
int stringWidth = label.getFontMetrics(labelFont).stringWidth(labelText);
int componentWidth = label.getWidth();
double widthRatio = (double)componentWidth / (double)stringWidth;
int newFontSize = (int)(labelFont.getSize() * widthRatio);
int componentHeight = label.getHeight();
int fontSizeToUse = Math.min(newFontSize, componentHeight);
编辑3:
这是我的标签字体大小计算器类
public class FitFontSize {
public static int Calculate(Label l) {
Point size = l.getSize();
FontData[] fontData = l.getFont().getFontData();
GC gc = new GC(l);
int stringWidth = gc.stringExtent(l.getText()).x;
double widthRatio = (double) size.x / (double) stringWidth;
int newFontSize = (int) (fontData[0].getHeight() * widthRatio);
int componentHeight = size.y;
System.out.println(newFontSize + " " + componentHeight);
return Math.min(newFontSize, componentHeight);
}
}
这是我在窗口顶部的标签。我想它的字体大小根据层大小的体积
Label l = new Label(shell, SWT.NONE);
l.setText("TITLE HERE");
l.setBounds(0,0,shell.getClientArea().width, (shell.getClientArea().height * 10 )/ 100);
l.setFont(new Font(display, "Tahoma", 16,SWT.BOLD));
l.setFont(new Font(display, "Tahoma", FitFontSize.Calculate(l),SWT.BOLD));
我刚刚移植了上面的代码 您可以使用方法
GC.stringExtent()在SWT中获取字符串的范围(长度)
并且您需要该类来获取标签的字体高度和字体宽度
Label label = new Label(parent, SWT.BORDER);
label.setSize(50, 30);
label.setText("String");
// Get the label size and the font data
Point size = label.getSize();
FontData[] fontData = label.getFont().getFontData();
GC gc = new GC(label);
int stringWidth = gc.stringExtent(label.getText()).x;
// Note: In original answer was ...size.x + (double)..., must be / not +
double widthRatio = (double) size.x / (double) stringWidth;
int newFontSize = (int) (fontData[0].getHeight() * widthRatio);
int componentHeight = size.y;
int fontsizeToUse = Math.min(newFontSize, componentHeight);
// set the font
fontData[0].setHeight(fontsizeToUse);
label.setFont(new Font(Display.getCurrent(), fontData[0]));
gc.dispose();
资料来源:
@jens na:请注意,您的示例代码没有处理GC
实例(我知道OP没有处理,但这就是我们在这里纠正它的原因)。因此,任何人复制/粘贴您的代码都会引入一个微妙的UI错误,导致资源泄漏。由于我必须在其他人的代码中找到这样一个错误,我可以说,它会导致UI更新冻结、窗口其他部分绘制小部件或其他奇怪现象。