Java 如何计算字体';宽度是多少?
我正在使用java绘制一些文本,但对我来说很难计算字符串的宽度。 例如: 郑中国...Java 如何计算字体';宽度是多少?,java,string,width,Java,String,Width,我正在使用java绘制一些文本,但对我来说很难计算字符串的宽度。 例如: 郑中国... 此字符串将占用多长时间?请参见和。对于单个字符串,您可以获取给定图形字体的度量,并使用该度量来计算字符串大小。例如: String message = new String("Hello, StackOverflow!"); Font defaultFont = new Font("Helvetica", Font.PLAIN, 12); FontMetrics fontMetrics
此字符串将占用多长时间?请参见和。对于单个字符串,您可以获取给定图形字体的度量,并使用该度量来计算字符串大小。例如:
String message = new String("Hello, StackOverflow!");
Font defaultFont = new Font("Helvetica", Font.PLAIN, 12);
FontMetrics fontMetrics = new FontMetrics(defaultFont);
//...
int width = fontMetrics.stringWidth(message);
如果您有更复杂的文本布局要求,例如在给定宽度内流动一段文本,则可以创建一个对象,例如本例(来自文档):
下面是一个简单的应用程序,可以向您展示如何在测试字符串宽度时使用FontMetrics:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class GUITest {
JFrame frame;
public static void main(String[] args){
new GUITest();
}
public GUITest() {
frame = new JFrame("test");
frame.setSize(300,300);
addStuffToFrame();
SwingUtilities.invokeLater(new Runnable(){
public void run() {
frame.setVisible(true);
}
});
}
private void addStuffToFrame() {
JPanel panel = new JPanel(new GridLayout(3,1));
final JLabel label = new JLabel();
final JTextField tf = new JTextField();
JButton b = new JButton("calc sting width");
b.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
FontMetrics fm = label.getFontMetrics(label.getFont());
String text = tf.getText();
int textWidth = fm.stringWidth(text);
label.setText("text width for \""+text+"\": " +textWidth);
}
});
panel.add(label);
panel.add(tf);
panel.add(b);
frame.setContentPane(panel);
}
}
看看这个很棒的演示,尤其是“文本测量”部分。它解释了可用的尺寸及其用途:
中的一些详细信息在以下类中使用getWidth方法:
import java.awt.*;
import java.awt.geom.*;
import java.awt.font.*;
class StringMetrics {
Font font;
FontRenderContext context;
public StringMetrics(Graphics2D g2) {
font = g2.getFont();
context = g2.getFontRenderContext();
}
Rectangle2D getBounds(String message) {
return font.getStringBounds(message, context);
}
double getWidth(String message) {
Rectangle2D bounds = getBounds(message);
return bounds.getWidth();
}
double getHeight(String message) {
Rectangle2D bounds = getBounds(message);
return bounds.getHeight();
}
}
您可以从Font.getStringBounds()中找到它:
无法实例化类型FontMetrics。请使用:FontMetrics FontMetrics=g.getFontMetrics();FontMetrics是抽象的;无法实例化FontMetrics metrics=新FontMetrics(字体);我在别的地方发现,你必须在(字体)后面和分号之前放一对空的大括号。我不知道为什么。FontMetrics=新FontMetrics(字体){}@EdPoor FontMetrics是一个抽象类(没有抽象方法)。您正在生成一个不会覆盖任何内容的匿名子类,因此它可以是一个具体的类。有趣的是,用于FontMetrics的javadoc说:“注意子类:由于这些方法中的许多形成了闭合的、相互递归的循环,因此必须注意在每个这样的循环中至少实现一个方法,以防止在使用子类时出现无限递归。”即,新的FontMetrics(font){}可能“起作用”,但它可能会也可能不会真正做正确的事情。奇怪的选择,如果要修改文档的话believed@gavinb,如何将其用于html文本请解释您的解决方案链接到“高级Java 2D”™ “桌面应用程序的主题”已失效。可能与
import java.awt.*;
import java.awt.geom.*;
import java.awt.font.*;
class StringMetrics {
Font font;
FontRenderContext context;
public StringMetrics(Graphics2D g2) {
font = g2.getFont();
context = g2.getFontRenderContext();
}
Rectangle2D getBounds(String message) {
return font.getStringBounds(message, context);
}
double getWidth(String message) {
Rectangle2D bounds = getBounds(message);
return bounds.getWidth();
}
double getHeight(String message) {
Rectangle2D bounds = getBounds(message);
return bounds.getHeight();
}
}
String string = "Hello World";
// Passing or initializing an instance of Font.
Font font = ...;
int width = (int) font.getStringBounds(string, new FontRenderContext(font.getTransform(), false, false)).getBounds().getWidth();