油漆()和油漆组件()之间的区别?

Posted

技术标签:

【中文标题】油漆()和油漆组件()之间的区别?【英文标题】:Difference between paint() and paintcomponent()? 【发布时间】:2013-02-12 18:08:48 【问题描述】:

我已经尝试过这方面的教程,但我仍然不太明白。基本上我的问题是哪种方法更好,为什么?我应该使用paint 还是paintComponent

请尽量让答案简单,谢谢。

【问题讨论】:

另见Painting in AWT and Swing 【参考方案1】:

引用paint()方法的文档

此方法实际上将绘画工作委托给三个受保护的方法:paintComponent、paintBorder 和paintChildren。 ... 只想专门化 UI(外观和感觉)委托的paint方法的子类应该重写paintComponent。

看起来paint() 方法实际上是在绘制组件,包括边框和子项。如果您只想自定义组件的外观,不包括边框和子项,请使用paintComponent()

http://docs.oracle.com/javase/7/docs/api/javax/swing/JComponent.html#paint(java.awt.Graphics)

【讨论】:

虽然正确,但谨慎的做法是链接到更多更新版本的 JavaDocs,只是为了向开发人员强调 API 的潜在变化 我编辑了链接。感谢@MadProgrammer 提醒我这一点 无论如何,答案仍然是 +1 ;)【参考方案2】:

一般来说,在 Swing 中绘画时,建议覆盖paintComponent

有很多原因,其中一个是 paintComponent 被绘制在底层,这意味着您不会意外擦除在绘制过程中渲染的任何组件 - 这种情况经常发生在在这里发帖的人身上.

您可能需要覆盖 paint 的次数非常少,但我始终鼓励您先尝试使其与 paintComponent 一起使用。

退房

Performing custom painting Painting in AWT and Swing(+1 垃圾神)

【讨论】:

我认为从双缓冲的角度覆盖paint() 或paintComponent() 并不重要。请参阅“在 AWT 和 Swing 中绘制”一文中的双缓冲部分。现在,如果您碰巧在帧级别覆盖了 paint()(我从不推荐)并且忘记调用 super.paint(),那么您可能会遇到一些麻烦。 @camickr 是的,你是对的,这就是不覆盖***容器的论据:P

以上是关于油漆()和油漆组件()之间的区别?的主要内容,如果未能解决你的问题,请参考以下文章

油漆组件是如何工作的?

图像比其他油漆组件晚半秒绘制

设计模式之Decorator(油漆工)(转)

油漆中的坐标

油漆工施工工序

AWT 标签/按钮/文本字段 + 油漆?