为什么必须使用paintComponent方法在Java中进行绘制?

为什么必须使用paintComponent方法在Java中进行绘制?,第1张

为什么必须使用paintComponent方法在Java中进行绘制

那是因为这就是它的工作方式。它是以此方式设计的。但是我想你的问题是关于“为什么”

请记住,Swing大约在15年前问世。批评之一是该API太慢(事实是,它之所以缓慢是因为人们并不真正了解如何使用它,但这是另一回事了),因此在设计API时必须考虑性能。

涉及许多因素…

Swing使用被动绘画过程,这意味着将绘画请求发送到绘画子系统并计划(返回EDT)进行处理。绘画子系统决定应绘画的内容,时间和量。这是在亵渎油漆子系统时完成的。

这意味着您永远不会真正知道何时可以执行绘制循环,因此我们需要某种方式来响应这些请求。

多功能性是另一个因素。API足够抽象,以至于与组件的绘制位置无关(很多)。也就是说,您可能被涂到屏幕,打印机甚至图像上。这意味着您无需重复很多绘画代码即可使其在不同的设备上运行。

您也永远不知道组件何时可以显示(即何时将其附加到本机对等端)。这意味着图形上下文可能是

null
,因此拥有“
helper”方法实际上可能会引起更多问题。当
paintComponent
被调用时,你(大部分)保证有一个有效的图形上下文要绘制的。

可扩展性将是另一个因素。不仅很容易重写

paintComponent
来更改某些组件绘制的方式,而且绘制系统也可以像当前情况一样提供扩展的Graphics上下文。当
paintComponent
(至少由paint子系统)调用时,它保证
Graphics
上下文将是的实例
Graphics2D
,它是的扩展
Graphics
,为API提供了许多重要的增强。

无需更改人们正在使用的基类就可以完成所有 *** 作,因此,如果他们不想使用这些功能,则不受其影响。

您可能需要通读…

  • 在AWT和Swing中绘画
  • 被动渲染与主动渲染

更多细节

并记住“绘画很有趣”;)

其他想法

要考虑的其他考虑因素之一是,

Graphics
API是绘画的核心,不仅考虑UI,而且考虑打印和图像处理。API与目标断开连接,从而具有更大的灵活性,但也具有通用性。

这意味着,如果您需要打印到打印机或渲染为图像,则可以使用与在屏幕上绘画相同的API。



欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5104534.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-17
下一篇 2022-11-16

发表评论

登录后才能评论

评论列表(0条)

保存