【问题标题】:Random calls of paintComponentpaintComponent 的随机调用
【发布时间】:2014-03-27 23:27:39
【问题描述】:

我在使用 Swing 时遇到了问题,我试图了解 paintComponent 是如何工作的,但我只是不明白为什么在这种情况下它会被调用两次甚至三次(它似乎是随机调用给我的) .

package paintComponentTest;

import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class UI {

public static void main(String[] args) {
    JFrame testFrame = new JFrame();

    TestPanel testPanel = new TestPanel();
    testFrame.setContentPane(testPanel);

    testFrame.setSize(500, 500);
    testFrame.setVisible(true);
}
}

class TestPanel extends JPanel {

@Override
public void paintComponent(Graphics g) {
    System.out.println("Called");
}
}    

我正在处理一个不同的项目,并且我的paintComponent 也被调用了几次,而我希望它只被调用一次,它会阻止我继续前进。

提前致谢!

【问题讨论】:

  • 关于“为什么”你只希望paintComponent 被调用一次的更多信息将继续为你提供解决问题的方法,因为这不是绘画的方式工作(或可能工作)

标签: java swing jpanel paint paintcomponent


【解决方案1】:

基本上,绘画是你无法控制的,你可以做的(很少)。

paintComponent 被调用(间接地)当重绘管理器决定组件由于某些事件需要被重绘时,例如组件被重新调整大小(直接或因为父容器被调整大小)或者它已变为可显示(现在在屏幕上可见或添加到可显示的组件中)和任意数量的系统事件。

您需要做的第一件事(除了在进行任何自定义绘画之前调用super.paintComponent)是放弃您可能认为您对绘画过程拥有控制的错觉。

接下来,您应该通读Painting in AWT and Swing,了解绘画过程的工作原理。

【讨论】:

  • 感谢您这么快回答。在我的paintComponent 进行任何重绘之前,我已经获得了super.paintComponent。事实是,我在我的paintComponent 中有一些处理要做,第一次调用它时我不能做处理,因为不是所有的东西都已经创建等等......我不会详细说明,但是我必须等待我的 JPanel paintComponent 的第二次调用,否则它将无法正常工作。结果,我有点使用标志来确定我是否在第一次通话中,我发现它非常难看,但我不知道该怎么做。无论如何,谢谢你,我会读这篇文章。
  • 一种解决方案可能是使用BufferedImage 在准备好后绘制您想要的内容,然后在paintComponent 方法中绘制BufferedImage。这有两个原因。您获得控制权并应尽快完成绘画,这将防止您的应用程序响应能力出现任何可能的滞后...
  • @user2007740 任何级别的处理都不应必须paintComponent 中只完成一次。你应该能够使用 init 方法和构造函数来让你的“一次性”事情不碍事......
  • @user2007740 一个可能的example of a back buffer
  • @user2007740 您的绘制代码需要具有响应性,并且应该代表当前已知的状态。如果您需要进行处理或等待某些事情,那么您不应该在您的绘制方法中执行它......或者实际上,在事件调度线程中,这将使您的应用程序看起来像是“停止”
猜你喜欢
  • 1970-01-01
  • 2017-01-03
  • 2013-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-30
  • 1970-01-01
相关资源
最近更新 更多