当前位置: 首页 > 面试题库 >

getGraphics()何时会返回有效的图形实例?

阎智
2023-03-14
问题内容

我正在尝试渲染自定义的Swing组件,在该组件中扩展了JComponent类。

为了简化组件要求,让我们总结一下我的组件,以使其需要渲染一些字符串,每个字符串都有自己的字体。

我需要将组件的大小精确调整为渲染字符串的宽度和高度的总和。

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

问题是,当我访问getGraphics()时,它始终为null,因此无法获取FontMetrics实例。如果我等待从重写的paintComponent()方法计算组件的大小,那么它太晚了(组件已经有大小了,对吧?)。

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

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

谢谢

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

如评论中下面提到的,GridLayout根本不遵守任何setXxxSize()。对于感兴趣的任何人,我都发布了使用GridLayout,BoxLayout和FlowLayout的结果,该结果使用一个简单的框架接收5个固定尺寸的组件,这些组件的宽度为200宽,高度为50(通过设置最小,最大和首选)。

检测结果:

所述 的GridLayout 总是沿宽度和高度调整大小(如在评论中提到)

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

至于 BoxLayout

PAGE_AXISY_AXIS 收缩的部件的宽度的大约一半它们的大小(104),但没有收缩的高度。

LINE_AXISX_AXIS 萎缩的组件,以什么似乎为零,但没有触及宽度高度。


问题答案:

首先,您可以使用TextLayout类及其关联的内容来测量您的Strings
。例如

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通知组件何时可见,但这对于在“
advance”中测量字符串不是必需的!



 类似资料:
  • 我的预览在方法中调用时返回null。测试类确实扩展了,因为它被保存在

  • 问题内容: 通常,当我调用getGraphics()时,即使我设置了xxx.getGraphics();它也返回null。xxx可见(如Google搜索所示…) 但这是行不通的,这使我感到沮丧,因为它在C-Sharp中很容易实现。 有谁知道这样做的更好方法,而不是使用getGraphics()? 问题答案: 您通常不希望在Java Swing组件上使用getGraphics,因为如果尚未渲染该组件

  • 问题内容: 我对虚无和回报有些“困惑”。通常,我知道在方法中使用void而不返回任何内容,而当我想将某些内容返回到调用代码时,则在方法中使用return。 但是在下面的代码中,我可以同时使用两者,而我的问题是,使用哪个? 以及如何确定?与性能有关吗? 通常,在两种情况下我的结果相同。 谢谢! 问题答案: 此方法: 您更改的内部状态,但此方法的调用者不知道的最终值。 在以下方法中,您将提示调用者的最

  • 问题内容: 假设我有一个像 然后在主要我有代码 显然,无论json格式不同,上述代码都会产生nil错误。Go中的json.Unmarshal()什么时候返回错误? 问题答案: 如果源中的值与目标中的值不对应,则JSON解码器不会报告错误。例如,如果源包含“状态”字段,这不是错误,但目标没有。 在其他情况下,Unmarshal函数确实会返回错误: 语法错误 类型不匹配 游乐场的例子

  • 我有一个主类,在那里初始化实例。然后,在getter的帮助下,我想从另一个类获取相同的实例,然而,它抛出了一个空指针异常。 其他类:

  • 问题内容: Java图形或图表库上有一个较早的线程,在该线程中发现JFreeChart相当不错, 但是 ,正如其常见问题解答所述,它并不意味着实时渲染。 谁能推荐一个支持实时渲染的类似库?只是一些基本的xy渲染-例如,从数据采集系统获取电压信号并对其进行绘制(x轴上的时间,y轴上的电压)。 问题答案: FAQ实际所说的是JFreeChart不支持硬实时图表,这意味着当新数据到达时或之后的确定时间间