Как использовать таймер свинга?
Я пытаюсь написать программу, которая рисует новый квадрат каждую секунду. Это мой код для моего класса 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();
}