如果没有事先调用paintComponent,我们如何进行文本测量?

时间:2011-11-25 10:19:53

标签: java swing graphics text measurement

大家好我需要使用java.awt.font.FontRenderContext进行一些文本测量,但是这个类要求我提供一个图形对象。

据我所知,我可以通过paintComponent / paint方法获取图形对象的唯一方法是:

@Override public void paintComponent(java.awt.Graphics g){ //...

但是,即使在调用paintComponent方法之前,我也需要进行此测量。我想知道这个问题的最佳解决方案是什么?

我是否创建了一个虚拟JLabel来完成这项工作?

5 个答案:

答案 0 :(得分:4)

无需创建虚拟GUI组件。例如,您可以创建BufferedImage

Graphics g = new BufferedImage(1, 1, BufferedImage.TYPE_INT_RGB).getGraphics();

答案 1 :(得分:4)

  

但是,即使在调用paintComponent方法

之前,我还需要进行此测量

您可能应该重写组件的getPreferredSize()方法。这就是Swing组件在可见之前知道如何调整组件大小和布局的方法。

JLabel使用以下内容:

FontMetrics fm = getFontMetrics(getFont());

或者,如果您需要FontRenderContext(),那么您可以使用对象的getGraphics()方法。通常我建议不要使用此方法,但这是因为人们尝试使用Graphics对象进行自定义绘制。但是在这种情况下,您只需要Graphics对象来测量文本,这样就可以了。

答案 2 :(得分:3)

在这种情况下,

TextLayout可能很有用。此example将结果与文本组件的FontMetrics进行比较,此example扩展了@ aioobe的BufferedImage建议。

答案 3 :(得分:2)

或者您可以在组件构造函数

中执行此操作
Font font = Font.createFont(Font.TRUETYPE_FONT, new File("ARIAL.TTF"));
font = font.deriveFont(12f);
FontMetrics fontMetrics = getFontMetrics(font);

答案 4 :(得分:0)

根据aioobe的回答,这是获取图形的一种聪明方式。也许每个人都意识到这一点,但是Graphics对象带有一个特定的字体,使用aioobe通用的获取图形的方式可以是任何东西。

我必须这样做(Jython):

g = java.awt.image.BufferedImage(1, 1, java.awt.image.BufferedImage.TYPE_INT_RGB).graphics
g.font = my_table.font

之后,在实现任何事情之前,这给出了准确的数字......欢呼:

hw_width = g.fontMetrics.stringWidth( "Hello World" )