【问题标题】:Prevent Java from repainting the content of a JPanel while updating防止 Java 在更新时重新绘制 JPanel 的内容
【发布时间】:2011-05-03 04:50:33
【问题描述】:

我有一个 JPanel,其中包含很多子组件。在向父 JPanel 更新\添加新组件时,我想阻止它重新绘制,如何实现?

【问题讨论】:

  • 我从未注意到明显的延迟。你能提供一个证明问题的 sscce sscce.org 吗?
  • 我同意垃圾神,我从未见过这个问题。组件在添加到面板时不会被绘制,因为默认情况下它们的大小为 0,因此没有可绘制的内容。只有在调用 panel.revalidate() 之后才会绘制组件,因为这会调用布局管理器,而布局管理器又会布置组件并给它们一个大小。如果您正在做一些奇怪的事情,那么我们需要一个 SSCCE 来了解您在做什么。

标签: java swing jpanel flicker jcomponent


【解决方案1】:

试试RepaintManager.currentManager(component).markCompletelyClean(component)。它将防止组件重新绘制。您可能需要在每次添加新组件后执行此操作。

【讨论】:

    【解决方案2】:
    setVisible(false)  
    

    更新

    setVisible(true)
    

    【讨论】:

      【解决方案3】:

      您可以尝试使用setIgnoreRepaint(boolean value),但它是一个典型的摆动功能,可以工作也可以不工作(主要是因为它依赖于 AWT,所以你永远不知道)。

      否则,您可以通过使用一个标志来覆盖paint 方法,该标志只是使方法返回而不调用super.paint()。 (实际上覆盖paintComponent应该是正确的选择)

      【讨论】:

      • setIgnoreRepaint(boolean value) 是完全不同的东西。 Java 文档说:Sets whether or not paint messages received from the operating system should be ignored. This does not affect paint events generated in software by the AWT, unless they are an immediate response to an OS-level paint message. This is useful, for example, if running under full-screen mode and better performance is desired, or if page-flipping is used as the buffer strategy.
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-09
      • 2014-05-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多