在Graphics2D上调用drawRect方法是否触发paintComponent方法?

问题描述:

我想弄清楚我的程序的行为,这是我最好的理论,为什么它做它的事情。我希望这将使用rand变量来决定绘制哪种形状,但相反,似乎paintComponent方法在定时器点火之间被多次调用,导致许多形状被绘制,我试图理解为什么。在Graphics2D上调用drawRect方法是否触发paintComponent方法?

这是代码:

public class TestPane extends JPanel { 

    private int yPos0; 
    private int yPos1; 
    private int boundary0=750; 
    private ActionEvent ae = null; 
    private Graphics g0 = null; 
    private int count=1; 

    public TestPane(Color foreground){ 
     setForeground(foreground); 
     this.setBackground(Color.BLUE); 
     Timer timer = new Timer(3000,new ActionListener(){ 
      @Override 
      public void actionPerformed(ActionEvent e){ 
       ae = e; 
       yPos0 =yPos0+50; 
        repaint(); 
      } 
     }); 
     timer.start(); 
    } 

    @Override 
    public void paintComponent(Graphics g){ 
      g0 = g; 
      super.paintComponent(g); 
      createShape(yPos0); 
      repaint(); 
    } 

    public void createShape(int ypos0){ 
     //generate random number between 1 and 3 and assign to rand 
     int rand = (int)((Math.random()*3)+1); 

     System.out.println(rand); 
     if(rand==1){ 
      Graphics2D g2d = (Graphics2D) g0.create(); 
      g2d.setColor(Color.RED); 
      g2d.drawRect(0, ypos0, 200, 50); 
     } 

     if(rand==2){ 
      Graphics2D g2d = (Graphics2D) g0.create(); 
      g2d.setColor(Color.GREEN); 
      g2d.drawRect(0, ypos0, 150, 50); 
      g2d.drawRect(50, ypos0+50,50,50); 
     } 
    } 
} 

之所以paintComponent被称为这么多次的是,你在呼唤导致本身方法中repaint被称为循环往复。这不是必需的,因为您已从Timer呼叫repaint

+0

哇,这是我的头颅。谢谢陌生人 – 2013-03-06 20:35:35