Как использовать таймер свинга?

Я пытаюсь написать программу, которая рисует новый квадрат каждую секунду. Это мой код для моего класса JPannel. У меня есть два других класса, но я считаю, что они не имеют отношения к моему вопросу. У одного есть метод main, где он создает объект другого класса, который содержит JFrame. Я просто не могу понять, как заставить таймер работать и как он работает.

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class Drawing extends JPanel  implements ActionListener{
    Drawing(){
        super();
        setBackground(Color.WHITE);
        startTimer();        
    }

    public void startTimer() {
           Timer timer = new Timer(1000, this);
           timer.start();
    }

    public void paintComponent(Graphics g) {
         int width = getWidth();             
         int height = getHeight();         

         super.paintComponent(g);  
         g.setColor(Color.BLUE);

         for(int x = 0; x < 999; x ++) {
         for(int y = 0; y < 999; y ++) {

                 g.drawRect(0,0, x, y);


         }
         }

    }

    public void actionPerformed(ActionEvent e) { 
           repaint();
    }

}

1 ответ

Решение

Избавьтесь от циклов for в вашем методе paintComponent. Обратите внимание, что методы рисования не должны изменять состояние объекта. Вместо этого метод actionPerformed таймера вызывается многократно - переместите туда свой счетчик или переменные x/y, а затем вызовите repaint(),

например,

private int x;
private int y;

public void paintComponent(Graphics g) {
     super.paintComponent(g);  
     g.setColor(Color.BLUE);


     // RECT_WIDTH etc are constants
     g.drawRect(x, y, RECT_WIDTH, RECT_HEIGHT);
}


public void actionPerformed(ActionEvent e) { 
    int width = getWidth();             
    int height = getHeight();

    // code here to change the object's state -- here to change
    // location of the rectangle
    x++;
    y++;

    // TODO: check that x and y are not beyond bounds and if so,
    // then re-position them

    repaint();
}
Другие вопросы по тегам