Javaを使用してテキストを描画していますが、文字列の幅を計算するのは困難です。例:zhengChina ...この文字列はどのくらいの期間を占めますか?
39025 次
6 に答える
35
単一の文字列の場合、特定の描画フォントのメトリックを取得し、それを使用して文字列サイズを計算できます。例えば:
String message = new String("Hello, StackOverflow!");
Font defaultFont = new Font("Helvetica", Font.PLAIN, 12);
FontMetrics fontMetrics = new FontMetrics(defaultFont);
//...
int width = fontMetrics.stringWidth(message);
特定の幅内でテキストの段落を流すなど、より複雑なテキストレイアウト要件がある場合は、java.awt.font.TextLayout
次の例のようなオブジェクトを作成できます(ドキュメントから)。
Graphics2D g = ...;
Point2D loc = ...;
Font font = Font.getFont("Helvetica-bold-italic");
FontRenderContext frc = g.getFontRenderContext();
TextLayout layout = new TextLayout("This is a string", font, frc);
layout.draw(g, (float)loc.getX(), (float)loc.getY());
Rectangle2D bounds = layout.getBounds();
bounds.setRect(bounds.getX()+loc.getX(),
bounds.getY()+loc.getY(),
bounds.getWidth(),
bounds.getHeight());
g.draw(bounds);
于 2009-10-06T11:09:46.653 に答える
7
Graphics.getFontMetrics()およびFontMetrics.stringWidth( )を参照してください。
于 2009-10-06T10:48:41.717 に答える
4
これは、文字列の幅をテストするときに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);
}
}
于 2009-10-06T11:10:20.037 に答える
2
この素晴らしいプレゼンテーション、特に「テキスト測定」の部分を見てください。使用可能なサイズとその使用法について説明します。デスクトップアプリケーションの高度なJava2D™トピック。
Java2D FAQの詳細情報:論理的、視覚的、およびピクセル境界の違いは何ですか?
于 2009-10-06T11:25:41.597 に答える
0
次のクラスで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();
}
}
于 2013-08-26T16:45:03.220 に答える
0
Font.getStringBounds()から見つけることができます:
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();
于 2015-04-02T05:38:42.027 に答える