java - 覆盖paint()运行两次

标签 java netbeans overriding paint

抱歉,我是这个网站的新手,但我的代码有问题,我在 JPanel 上绘制一组图像,所以我重写了绘制方法,但是当我运行该项目时,我看起来它正在运行两次..因为我尝试放置 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);
    }
}

最佳答案

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

参见Painting in AWT and SwingPerforming Custom Painting有关绘画的更多详细信息

关于java - 覆盖paint()运行两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30012238/

相关文章:

java - Eclipse:将导入添加到一堆类中

java - 如何确保相同的元素不会在数组中出现两次

java - 执行 jButton 操作时立即更改 jLabel 可见性

c - C 函数(fgets、scanf、fread、fwrite、fopen)的未知行为

python - 调用子方法时如何强制执行强制父方法调用?

Java Sockets - 将文件从客户端发送到服务器

java - Java : Cannot find symbol? [duplicate]

java - 创建 DB 实体类时的 NetBeans 问题

java - 子类抛出异常的标准是什么

java - 我们可以在一个接口(interface)中有一个 main() 并在实现这个接口(interface)的类中有不同的 main() 实现吗?