【问题标题】:paint() and repaint() in JavaJava中的paint()和repaint()
【发布时间】:2012-06-01 20:59:25
【问题描述】:

我可能在过去的两个小时里浏览和阅读了这些方法和 Graphics 类,也许我很愚蠢,哈哈,但我只是不理解它们。它们是干什么用的?我知道他们应该在屏幕上重绘或更新组件,但我从来不明白为什么需要这样做(我是新手)。例如,如果我在屏幕上移动 JLabel,调用 setLocation() 就可以很好地移动它。这是不需要 repaint() 的场景吗?它在哪些情况下有用,为什么?

如果您认为这是一个可以使用搜索功能解决的问题,但无论出于何种原因我没有得到它,我们深表歉意。

【问题讨论】:

  • 内部调用重绘。它是从 JLabel 的 setLocation 方法中调用的。 (它实际上是一个较长的方法调用链,请随意关注它,看看里面有什么。你可以在任何严肃的 IDE 中进行操作)
  • 好的,在 setLocation() 中调用它肯定会有所帮助。谢谢你。我什么时候会改变一些不会称之为的东西?
  • swing 库中的所有控件都可以在它们的属性以任何方式与它们的外观(位置、大小、颜色、文本等)发生变化时重新绘制。但是,当您想要实现非默认结果时,请自行实现 paint 方法。在 JApplets 中绘制几何图形是一种常见的练习。您可能还想阅读有关双缓冲的主题,这与调用这两种方法的方式有关。根据我的经验,一个更真实的例子是扩展一个摆动组件,通过覆盖绘画来绘制 wav 文件的傅立叶变换的频谱
  • 谢谢!现在更有意义了。因此,如果我在视觉方面使用的所有内容都内置在 swing 中,我就不必担心调用 repaint()?
  • 没错,库类会帮你搞定的。

标签: java paint repaint


【解决方案1】:

Paint() 和 Repaint() 方法的区别

油漆():

此方法包含绘制此组件的指令。实际上,在 Swing 中,您应该更改paintComponent() 而不是paint(),因为paint 调用paintBorder()、paintComponent() 和paintChildren()。你不应该直接调用这个方法,而应该调用 repaint()。

重绘():

这个方法不能被覆盖。它控制 update() -> paint() 循环。您应该调用此方法来让组件重新绘制自身。如果您对组件的外观做了任何更改,但没有更改其大小(例如更改颜色、动画等),请调用此方法。

【讨论】:

  • 是的,+1 提到 paint() 本身通常不应被 Swing 中的用户代码覆盖。
  • 不幸的是,在阅读了大量文档后,我已经听说过这个。我只是想了解我将在哪些应用程序中使用它,以及“绘制此组件”的实际含义。
  • 这个答案的逻辑对我来说似乎有点违反直觉。对于绘画,你描述,“你不应该直接调用这个方法,你应该调用 repaint() 。”然后你继续说,“如果你做了任何事情来改变组件的外观,但没有改变它的大小,那么调用这个方法。”对于重绘,这意味着如果我改变了它的大小,我就不能调用这些函数中的任何一个。如果我改变了大小,这就是我希望它重绘 UI 的原因,那我该怎么称呼?
  • repaint() 是否将组件重置为其原始状态?假设我有一个白色背景的 JPanel,我在上面画了一个三角形。是否要重新绘制以删除该三角形并重置 JPanel?
【解决方案2】:

paint() 方法支持通过 Graphics 对象进行绘制。

repaint() 方法用于使 AWT 绘制线程调用 paint()

【讨论】:

    【解决方案3】:

    除非你需要在组件上渲染特定的东西,否则没有必要调用 repaint。 “特定的东西”是指您正在使用的窗口工具包内部未提供的任何东西。

    【讨论】:

    • 对不起,我不明白那个回复。你能提供一个例子吗?将什么渲染到什么上?
    • 请参阅 this article 以获得很好的解释。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-27
    • 2013-03-12
    • 1970-01-01
    • 2014-01-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多