hejiero 2013-08-09 14:39 采纳率: 0%
浏览 2007

paintComponent(Graphics g)会连续调用两次,想问各位大神什么原理?

在paintComponent()里面加多一个输出语句,可以发现发现protected void

paintComponent(Graphics g)会连续调用两次,想问各位大神什么原理?

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

public class DrawArcs extends JFrame {
  public DrawArcs() {
    setTitle("DrawArcs");
    add(new ArcsPanel());
  }

  /** Main method */
  public static void main(String[] args) {
    DrawArcs frame = new DrawArcs();
    frame.setLocationRelativeTo(null); // Center the frame
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);
    frame.setSize(250, 300);

  }
}

// The class for drawing arcs on a panel
class ArcsPanel extends JPanel {
  // Draw four blazes of a fan
    int i=0;
 protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    System.out.println(getWidth()+"+"+getHeight()+"+"+i); 
    i++;
    int xCenter = getWidth() / 2;
    int yCenter = getHeight() / 2;
    int radius = (int)(Math.min(getWidth(), getHeight()) * 0.4);
    int x = xCenter - radius;
    int y = yCenter - radius;
    g.fillArc(x, y, 2 * radius, 2 * radius, 0, 30);
    g.fillArc(x, y, 2 * radius, 2 * radius, 90, 30);
    g.fillArc(x, y, 2 * radius, 2 * radius, 180, 30);
    g.fillArc(x, y, 2 * radius, 2 * radius, 270, 30);
  }

}
  • 写回答

1条回答 默认 最新

  • ChatGPTᴼᴾᴱᴺᴬᴵ 2023-01-12 09:48
    关注

    paintComponent 方法是由 JPanel 类和其子类重写的,它负责绘制组件的外观。在窗口第一次显示或者窗口大小变化时,系统会自动调用这个方法来绘制组件。


    因为在您的程序中第一次调用 paintComponent 时窗口大小是不确定的,所以窗口会把组件绘制两次,第一次绘制的时候窗口的大小是不确定的,所以会先调用一次paintComponent来获取窗口的大小,之后才能正确绘制组件。

    评论

报告相同问题?

悬赏问题

  • ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝
  • ¥20 腾讯企业邮箱邮件可以恢复么
  • ¥15 有人知道怎么将自己的迁移策略布到edgecloudsim上使用吗?
  • ¥15 错误 LNK2001 无法解析的外部符号
  • ¥50 安装pyaudiokits失败
  • ¥15 计组这些题应该咋做呀
  • ¥60 更换迈创SOL6M4AE卡的时候,驱动要重新装才能使用,怎么解决?
  • ¥15 让node服务器有自动加载文件的功能
  • ¥15 jmeter脚本回放有的是对的有的是错的
  • ¥15 r语言蛋白组学相关问题