java – getGraphics()什么时候会返回一个有效的图形实例?

我正在尝试渲染一个自定义Swing组件,我扩展了JComponent类.

为了简化组件需求,我们只需将我的组件汇总为需要渲染一些字符串,每个字符串都有自己的字体.

我需要将我的组件的大小精确到我渲染的字符串的总宽度和高度.

为了确定这个大小,我使用FontMetrics来计算每个字符串的尺寸.有了这些信息,我可以弄清楚我的组件的大小,并适当调整大小.

问题是,当我访问getGraphics()时,它总是为null,所以我无法得到FontMetrics实例.如果我等待从覆盖的paintComponent()方法计算我的组件大小,它已经太晚了(组件已经有一个大小,对吧?).

文档说“如果此组件当前不可显示,则此方法将返回null”.那么我何时知道组件何时可以显示并且有一个Graphics对象供我调整组件大小?

一旦调用frame setVisible(true)框架,渲染组件的Swing调用顺序是什么?

谢谢

更新:2010年2月6日星期二23:34

正如评论中所提到的,GridLayout根本不尊重任何setXxxSize().对于任何感兴趣的人,我发布了使用GridLayout,BoxLayout和FlowLayout的结果,使用一个简单的框架,接收5个固定大小的200宽50高的组件(通过设置min,max和preferred).

检测结果:

GridLayout始终沿宽度和高度调整大小(如注释中所述)

无论如何,FlowLayout始终尊重组件大小.

至于BoxLayout ……

PAGE_AXIS和Y_AXIS将组件的宽度缩小到它们大小的一半(104),但没有缩小高度.

LINE_AXIS和X_AXIS将组件的高度缩小到看似零但没有触及宽度的高度.

解决方法

首先,您可以使用 TextLayout类及其相关内容来测量字符串.例如
public static void main(final String[] args) throws Exception
{
    final FontRenderContext frc = new FontRenderContext(null,true,true);
    final Font font = new Font("serif",Font.PLAIN,18);
    final TextLayout layout = new TextLayout("This is a test",font,frc);
    final Rectangle2D bounds = layout.getBounds();
    System.err.println((int) (bounds.getWidth() + .5));
}

其次,当使用ComponentListener可以看到组件可见时,可以通知您,但这不是“提前”测量字符串所必需的!

相关文章

ArrayList简介:ArrayList 的底层是数组队列,相当于动态数组。与 Java 中的数组相比,它的容量能动态增...
一、进程与线程 进程:是代码在数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位。 线程...
本文为博客园作者所写: 一寸HUI,个人博客地址:https://www.cnblogs.com/zsql/ 简单的一个类...
#############java面向对象详解#############1、面向对象基本概念2、类与对象3、类和对象的定义格式4、...
一、什么是异常? 异常就是有异于常态,和正常情况不一样,有错误出错。在java中,阻止当前方法或作用域...
Collection接口 Collection接口 Collection接口 Collection是最基本的集合接口,一个Collection代表一组...