Java Override paint()运行两次

Java Override paint()运行两次,java,netbeans,overriding,paint,Java,Netbeans,Overriding,Paint,抱歉,我在这个网站上更新了,但是我的代码有问题,我在JPanel上画了一组图像,所以我重写了paint方法,但是当我运行这个项目时,我看起来它运行了两次。。因为我试着放一个println,它在输出中出现了两次。请帮忙:( 我从这个框架创建了面板: public class VentanaPrincipal extends JFrame{ public VentanaPrincipal() { PanelDibujo panel= new PanelDibujo(cadenaOficia

抱歉,我在这个网站上更新了,但是我的代码有问题,我在JPanel上画了一组图像,所以我重写了paint方法,但是当我运行这个项目时,我看起来它运行了两次。。因为我试着放一个println,它在输出中出现了两次。请帮忙:(

我从这个框架创建了面板:

public class VentanaPrincipal extends JFrame{

public VentanaPrincipal() {
    PanelDibujo panel= new PanelDibujo(cadenaOficial);
    setLocation(300, 10);
    setDefaultCloseOperation(3);
    setSize(660, 700);
    add(panel);
    }
}

每当UI需要重新绘制时,JVM就会调用
paint
方法。这是JVM的责任。就像最小化窗口然后最大化窗口一样,将调用
paint
方法

我建议您先最小化窗口,然后再将其最大化。您会再次发现输出正在重新打印。

  • Swing的第一条规则是,您不控制绘制过程。当系统决定需要进行绘制时,将进行绘制,这称为被动绘制。您可以向系统提出重新绘制的建议,但这取决于系统决定可能发生的内容和时间
  • 不要重写
    paint
    ,重写
    paintComponent
    ,并确保在进行任何自定义绘制之前调用
    super.paintComponent
    。绘制是通过一系列链式方法调用完成的,很难打破这个链式,并最终得到没有尽头的奇怪绘制工件。常规建议您可以替代
    paintComponent
    ,因为它通常是执行绘制的更安全的地方
  • 不要在任何绘制方法中加载资源或执行任何长时间运行的操作,这将减慢重新绘制的速度,绘制应尽可能快地运行
  • 绘制应绘制组件的当前状态,并应避免执行任何计算,且内部几乎没有逻辑。应在外部(如通过设置器)决定如何更改状态,然后触发组件的
    重新绘制

有关绘制的更多详细信息,请参见和。您可能要调用此面板两次?运行/使用此类的代码在哪里?您不应该在
paint
方法中调用
getImage
paint
方法应该是快速的,而加载图像的速度并不快。最好在你的结构是啊,我在考虑移动那个东西。但我的问题是它运行了两次。但我只是创建了面板,不再调用绘画方法。明白了,请给我一些建议?我只需要运行一次:(@JoaoSanchez由于多次调用
paint
而面临的问题是什么?我画了一张图,一组图像,然后计时器在其中一张图像周围移动,并且这样做了两次,这一切都是一场灾难:/!@JoaoSanchez paint应该绘制当前状态,不应该包含太多内容)逻辑。计时器应该控制状态并独立于绘制进行更新,调用
repaint
来更新状态UI@JoaoSanchez我完全同意MadProgrammer的建议。paint方法只负责绘制图形,不应在该方法中插入编程逻辑。也是建议的Robin在问题中评论说,
paint
方法应该是快速的,编程逻辑和加载图像会减慢速度。非常感谢,我这样做是为了更快地完成,因为只是为了展示一点过程,但它变得复杂,我现在将遵循正确的方法,泰。
public class VentanaPrincipal extends JFrame{

public VentanaPrincipal() {
    PanelDibujo panel= new PanelDibujo(cadenaOficial);
    setLocation(300, 10);
    setDefaultCloseOperation(3);
    setSize(660, 700);
    add(panel);
    }
}