大家好我需要使用java.awt.font.FontRenderContext
进行一些文本测量,但是这个类要求我提供一个图形对象。
据我所知,我可以通过paintComponent / paint方法获取图形对象的唯一方法是:
@Override public void paintComponent(java.awt.Graphics g){ //...
但是,即使在调用paintComponent
方法之前,我也需要进行此测量。我想知道这个问题的最佳解决方案是什么?
我是否创建了一个虚拟JLabel来完成这项工作?
答案 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" )