gpt4 book ai didi

java - AttributedString 的 FontMetrics.getStringBounds 给出了错误的结果?

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

如下图所示,在JPanel(500X500)上绘制了一个AttributedString。

该 AttributedString 的 FontMetrics.getStringBounds() 给出的宽度为 164.0,如跟踪输出所示。

java.awt.geom.Rectangle2D$Float[x=0.0,y=-12.064453,w=164.0,h=15.09375]

但是图片建议宽度应该是300-400(因为面板的宽度是500)。

你能帮忙评论一下原因和解决方法吗?

enter image description here

MyJFrame.java

import javax.swing.*;
import java.awt.*;
import java.awt.font.TextAttribute;
import java.text.AttributedString;

class MyJPanel extends JPanel {
MyJPanel() {
setPreferredSize(new Dimension(500,500));
}

@Override
public void paintComponent(Graphics gold) {
super.paintComponent(gold);
Graphics2D g = (Graphics2D)gold;
//
AttributedString text = new AttributedString("Bunny rabits and flying ponies");
text.addAttribute(TextAttribute.FONT, new Font("Arial", Font.BOLD, 24), 0, "Bunny rabits".length());
text.addAttribute(TextAttribute.FOREGROUND, Color.RED, 0, "Bunny rabits".length());

text.addAttribute(TextAttribute.FONT, new Font("Arial", Font.BOLD & Font.ITALIC, 32), 17, 17 + "flying ponies".length());
text.addAttribute(TextAttribute.FOREGROUND, Color.BLUE, 17, 17 + "flying ponies".length());

FontMetrics fm = g.getFontMetrics();

System.out.println(fm.getStringBounds(text.getIterator(), 0, text.getIterator().getEndIndex(), g));
g.drawString(text.getIterator(), 50, 50);
//
g.dispose();
}
}

public class MyJFrame extends JFrame {

public static void main(String[] args) {
MyJFrame frame = new MyJFrame();
frame.setContentPane(new MyJPanel());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}
}

最佳答案

FontMetrics fontMetrics = graphics.getFontMetrics() 根据当前在 graphics 对象上设置的单一字体返回一个 FontMetrics 对象。您没有显式更改 graphics 使用的字体,因此它使用当前 L&F 为 JPanel 指定的默认字体。

与边界计算相关的

FontMetrics 方法接受“简单的”CharacterIterator(不提供字体信息)而不是 AttributedCharacterIterator(提供字体信息) ).因此,fontMetrics.getStringBounds() 只是根据相同大小的单一字体计算文本边界。

当使用具有不同字体和字体大小的 AttributedCharacterIterator 时,您需要使用 java.awt.font.TextLayout 来确定正确的边界:

TextLayout textLayout = new TextLayout( 
text.getIterator(),
g.getFontRenderContext()
);
Rectangle2D.Float textBounds = ( Rectangle2D.Float ) textLayout.getBounds();

g.drawString( text.getIterator(), 50, 50 );
// lets draw a bounding rect exactly around our text
// to be sure we calculated it properly
g.draw( new Rectangle2D.Float(
50 + textBounds.x, 50 + textBounds.y,
textBounds.width, textBounds.height
) );

关于java - AttributedString 的 FontMetrics.getStringBounds 给出了错误的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23975076/

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