2010-09-13 12 views
1

J'essaie d'éditer ma minuterie de sorte que toutes les 25 fois repaint() s'appelle la vitesse d'allumage du minuteur coupe de moitié. Donc les 25 premières fois c'est 500; puis les 25 prochaines fois ses 250; etc.Changement de délai dans la minuterie Java

Deux 'FACILE POUR LES RENCONTRES' questions:

1) Pourquoi Eclipse me fait faire les variables statiques (ou autrement pas la compilation)? 2) Le programme ne semble pas atteindre la fonction où je diviser la vitesse de moitié et régler le retard à cette nouvelle vitesse. Pourquoi donc? Comment je le répare?

public class MovingCircle extends JFrame implements ActionListener { 

    Ellipse2D.Double myEllipse; 
    Rectangle2D.Double backgroundRectangle; 
    private static int paintCount = 0; 
    private static int speed = 500; 

    public MovingCircle() { 

     //Make the ellipse at the starting position 
     myEllipse = new Ellipse2D.Double(30, 30, 20, 20); 

     //Make the background rectangle to "erase" the screen 
     backgroundRectangle = new Rectangle2D.Double(0, 0, 400, 300); 
    } 

    public static void main(String[] args) { 

     MovingCircle b = new MovingCircle(); 
     b.setSize(400, 300); 
     b.setVisible(true); 
     b.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     Timer t = new Timer(500, b); 
     t.start(); 

     if(paintCount % 25 == 0) { 

      t.setDelay((int)(speed/2)); 
      speed = (int)(speed/2); 
      System.out.println(speed); 
     } 
    } 

    public void actionPerformed(ActionEvent ae) { 

     //This will be called by the Timer 
     myEllipse.setFrame(myEllipse.getX()+1, myEllipse.getY()+1, myEllipse.getWidth(), myEllipse.getHeight()); 
     //Move 1 x-pixel and 1 y-pixel every 50 milliseconds^
     repaint(); 
    } 

    public void paint(Graphics g) { 

     paintCount++;  // Incremenets by one for every repaint(). 
     System.out.println(paintCount); 
     int isPaintTen = (int)(paintCount/10); // Divid current count by 10. 
     Graphics2D g2 = (Graphics2D)g; 

     if((isPaintTen % 2) == 0){  // Take modulus to set if #/10 is odd or even. 

      g2.setColor(Color.YELLOW); 
      g2.fill(backgroundRectangle); 
      g2.setColor(Color.RED); 
      g2.draw(myEllipse); 
     } 

     else if((isPaintTen % 2) == 1) { 

      g2.setColor(Color.RED); 
      g2.fill(backgroundRectangle); 
      g2.setColor(Color.YELLOW); 
      g2.draw(myEllipse); 
     } 
    } 

}

+1

Il sera plus facile pour « l'expérimenté » pour vous aider, si vous prenez le temps de fixer l'empreinte de votre exemple de code donc on peut le lire sans compter les accolades. – Lee

Répondre

1
  1. Dans votre exemple, paintCount et speed doivent être statiques parce que vous les utilisez sans exemple, à partir d'une méthode, main(), qui lui-même est statique. Pour éviter d'avoir à les rendre statiques, vous auriez pu les référencer comme b.paintCount et b.speed.

  2. Le code qui modifie votre minuterie doit être déplacé dans votre méthode paint(). Cela signifie que votre instance Timer devra devenir une variable d'instance, et vous devriez probablement créer et démarrer le timer dans le constructeur. Incidemment, ces changements exigent également que paintCount et speed soient également rendus "non statiques".

Vous devriez vous retrouver avec quelque chose comme ceci:

public class MovingCircle extends JFrame implements ActionListener{ 
    Ellipse2D.Double myEllipse; 
    Rectangle2D.Double backgroundRectangle; 
    private int paintCount = 0; 
    private int speed = 500; 
    private Timer tmr; 

    public MovingCircle() { 
     //Make the ellipse at the starting position 
     myEllipse = new Ellipse2D.Double(30, 30, 20, 20); 

     //Make the background rectangle to "erase" the screen 
     backgroundRectangle = new Rectangle2D.Double(0, 0, 400, 300); 

     this.tmr = new Timer(500, this); 
     tmr.start(); 
    } 

    public static void main(String[] args) { 
     MovingCircle b = new MovingCircle(); 
     b.setSize(400, 300); 
     b.setVisible(true); 
     b.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 

    public void actionPerformed(ActionEvent ae) { 
     //This will be called by the Timer 
     myEllipse.setFrame(myEllipse.getX()+1, myEllipse.getY()+1, myEllipse.getWidth(), myEllipse.getHeight()); //Move 1 x-pixel and 1 y-pixel every 50 milliseconds 
     repaint(); 
    } 

    public void paint(Graphics g) { 
     paintCount++;  // Incremenets by one for every repaint(). 
     System.out.println(paintCount); 

     if(paintCount % 25 == 0){ 
      tmr.setDelay((int)(speed/2)); 
      speed = (int)(speed/2); 
      System.out.println(speed); 
     } 

     int isPaintTen = (int)(paintCount/10); // Divid current count by 10. 
     Graphics2D g2 = (Graphics2D)g; 
     if((isPaintTen % 2) == 0){  // Take modulus to set if #/10 is odd or even. 
      g2.setColor(Color.YELLOW); 
      g2.fill(backgroundRectangle); 
      g2.setColor(Color.RED); 
      g2.draw(myEllipse); 

     } else if((isPaintTen % 2) == 1) { 
      g2.setColor(Color.RED); 
      g2.fill(backgroundRectangle); 
      g2.setColor(Color.YELLOW); 
      g2.draw(myEllipse);  
     } 
    } 
} 
+0

Merci beaucoup !!!! – user445755

0
  1. Parce que vous les utilisez directement dans la méthode main, qui est statique.
  2. Je ne vois pas une méthode qui fait cela, mais je vois un bloc de code dans votre méthode principale. Cela a probablement à voir avec le paintCount % 25 == 0 qui n'est jamais vrai. Déboguez-le, ou mettez quelques instructions println pour voir quelle est la valeur de paintCount sur les premiers 50-100 appels. Cela vous donnera probablement votre réponse.