在 Swing Graphics2d 中测量文本边界
measuring text bounds in Swing Graphics2d
我正在使用这种方法测量 Swing 图形中的文本边界
但它不涵盖整个文本。
它特别适用于测量高度...
当我输入英文文本时它会变得更好,但我应该使用波斯字体。
texts and bounds image
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);
}
这是我绘制文本和边界的方式:
g.drawString(text, x-textBounds.width/2, y+textBounds.height/2);
g.drawRect(x-textBounds.width/2, y-textBounds.height/2, textBounds.width, textBounds.height);
这里有两种获取完整字体的方法。我只是从互联网上抓取了一些随机的波斯语文本,因为 OP 懒得粘贴一个小例子。
public class BoxInFont {
String text = "سادگی، قابلیت تبدیل";
int ox = 50;
int oy = 50;
void buildGui(){
JFrame frame = new JFrame("Boxed In Fonts");
JPanel panel = new JPanel(){
@Override
protected void paintComponent(Graphics g){
super.paintComponent(g);
Graphics2D g2d = (Graphics2D)g;
g.drawString(text, ox, oy);
Font f = g.getFont();
Rectangle2D charBounds = f.getStringBounds(text, g2d.getFontRenderContext());
GlyphVector gv = f.layoutGlyphVector(g2d.getFontRenderContext(), text.toCharArray(), 0, text.length(), GlyphVector.FLAG_MASK);
Rectangle2D bounds = gv.getVisualBounds();
g2d.translate(ox, oy);
//g2d.drawRect((int)bounds.getX() + ox, (int)bounds.getY() + oy, (int)bounds.getWidth(), (int)bounds.getHeight());
g2d.draw(bounds);
g2d.draw(charBounds);
System.out.println("vis: " + bounds);
System.out.println("char: " + charBounds);
}
};
frame.add(panel);
frame.setSize(400, 400);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
public static void main(String[] args){
EventQueue.invokeLater(()->new BoxInFont().buildGui());
}
}
绘制的两个框完全封装了文本。我认为视觉边界更适合。
OP 正在做的事情有问题,他们忽略了返回的矩形的 x 和 y 值。他们只使用宽度和高度。如果您查看此程序的输出,您会发现 x 和 y 不为 0。
vis:
java.awt.geom.Rectangle2D$Float[x=-0.2056962,y=-9.814648,w=96.76176,h=13.558318]
char:
java.awt.geom.Rectangle2D$Float[x=0.0,y=-12.568359,w=97.0,h=15.310547]
我正在使用这种方法测量 Swing 图形中的文本边界 但它不涵盖整个文本。 它特别适用于测量高度... 当我输入英文文本时它会变得更好,但我应该使用波斯字体。
texts and bounds image
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);
}
这是我绘制文本和边界的方式:
g.drawString(text, x-textBounds.width/2, y+textBounds.height/2);
g.drawRect(x-textBounds.width/2, y-textBounds.height/2, textBounds.width, textBounds.height);
这里有两种获取完整字体的方法。我只是从互联网上抓取了一些随机的波斯语文本,因为 OP 懒得粘贴一个小例子。
public class BoxInFont {
String text = "سادگی، قابلیت تبدیل";
int ox = 50;
int oy = 50;
void buildGui(){
JFrame frame = new JFrame("Boxed In Fonts");
JPanel panel = new JPanel(){
@Override
protected void paintComponent(Graphics g){
super.paintComponent(g);
Graphics2D g2d = (Graphics2D)g;
g.drawString(text, ox, oy);
Font f = g.getFont();
Rectangle2D charBounds = f.getStringBounds(text, g2d.getFontRenderContext());
GlyphVector gv = f.layoutGlyphVector(g2d.getFontRenderContext(), text.toCharArray(), 0, text.length(), GlyphVector.FLAG_MASK);
Rectangle2D bounds = gv.getVisualBounds();
g2d.translate(ox, oy);
//g2d.drawRect((int)bounds.getX() + ox, (int)bounds.getY() + oy, (int)bounds.getWidth(), (int)bounds.getHeight());
g2d.draw(bounds);
g2d.draw(charBounds);
System.out.println("vis: " + bounds);
System.out.println("char: " + charBounds);
}
};
frame.add(panel);
frame.setSize(400, 400);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
public static void main(String[] args){
EventQueue.invokeLater(()->new BoxInFont().buildGui());
}
}
绘制的两个框完全封装了文本。我认为视觉边界更适合。
OP 正在做的事情有问题,他们忽略了返回的矩形的 x 和 y 值。他们只使用宽度和高度。如果您查看此程序的输出,您会发现 x 和 y 不为 0。
vis: java.awt.geom.Rectangle2D$Float[x=-0.2056962,y=-9.814648,w=96.76176,h=13.558318] char: java.awt.geom.Rectangle2D$Float[x=0.0,y=-12.568359,w=97.0,h=15.310547]