Изменение задержки в таймере Java - PullRequest
0 голосов
/ 13 сентября 2010

Я пытаюсь отредактировать свой таймер так, чтобы каждые 25 раз функция repaint () называлась таймером, а скорость срабатывания таймера уменьшается вдвое.Итак, первые 25 раз это 500;затем следующие 25 раз его 250;и т. д.

Два 'ЛЕГКИЕ ДЛЯ ОПЫТНЫХ' вопросы:

1) Почему Eclipse заставляет меня делать переменные статическими (или иначе не компилироваться))?

2) Программа, похоже, не достигает функции, где я делю скорость пополам и устанавливаю задержку на эту новую скорость.Это почему?Как мне это исправить?

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 );  
        }
   }

}

Ответы [ 2 ]

1 голос
/ 13 сентября 2010
  1. В вашем примере paintCount и speed должны быть статическими, потому что вы используете их без экземпляра, изнутри метода main(), который сам по себе является статическим.Чтобы не делать их статичными, вы могли бы ссылаться на них как b.paintCount и b.speed.

  2. Код, который изменяет ваш таймер, должен перейти в ваш метод paint().Это означает, что ваш экземпляр Timer должен стать переменной экземпляра, и вам, вероятно, следует создать и запустить таймер в конструкторе.Между прочим, эти изменения также требуют, чтобы paintCount и speed также были сделаны "нестатичными".

В результате вы должны получить что-то вроде этого:

0 голосов
/ 13 сентября 2010
  1. Поскольку вы используете их непосредственно в методе main, который является статическим.
  2. Я не вижу метода, который делает это, но я вижу блок кода в вашемосновной метод.Это, вероятно, связано с тем, что paintCount % 25 == 0 никогда не будет правдой.Отладьте его или поместите несколько операторов println, чтобы увидеть, что значение paintCount превышает первые 50-100 вызовов.Это, вероятно, даст вам ваш ответ.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...