覆盖 paint() 运行两次

Override paint() runs twice

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

public class PanelDibujo extends JPanel {

String cadenaOficial;

public PanelDibujo(String cad){
    cadenaOficial=cad;
}

@Override
public void paint(Graphics a){
    Toolkit t=Toolkit.getDefaultToolkit();
    Image imagen=t.getImage("imagenes/muro.jpg");
    g.drawImage(imagen, 20, 20, this); 
    System.out.println(cadenaOficial);
    }
}

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

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 的责任。就像当您最小化 window 然后最大化它时,将调用 paint 方法。

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

  • Swing 的第一条规则,您无法控制绘制过程。当系统决定需要完成绘画时,绘画就会发生,这被称为被动绘画。您可以向系统提出应该进行重绘的建议,但由系统决定可能发生什么以及何时发生
  • 不要覆盖 paint,覆盖 paintComponent 并确保在进行任何自定义绘画之前调用 super.paintComponent。绘画是通过一系列链式方法调用完成的,要打破这个链条并以无穷无尽的怪异绘画工件结束是非常容易的。通用约定建议您改写 paintComponent,因为它通常是执行绘画的更安全的地方
  • 不要在任何绘画方法中加载资源或执行任何长时间的 运行ning 操作,这会减慢您的重绘速度,并且绘画应该 运行 尽快
  • 绘制应该绘制组件的当前状态并且应该避免执行任何计算并且在内部几乎没有逻辑。关于状态应该如何改变的决定应该在外部完成(比如通过设置器)然后触发 [=组件的 14=]

有关绘画的更多详细信息,请参阅Painting in AWT and Swing and Performing Custom Painting