Java Repaint () и инициализация объектов - PullRequest
1 голос
/ 03 октября 2011

У меня есть класс, который должен имитировать анимацию фейерверка с использованием paintComponent и repaint (). Проблема, которую я обнаружил, заключается в том, что «Фейерверк» заново инициализируется. каждый раз, когда метод вызывается, так что поле projectileTime фейерверка каждый раз сбрасывается в ноль (как указано в конструкторе). Где подходящее место для создания объекта фейерверка, чтобы поле projectileTime увеличивалось соответствующим образом? (В этом классе или в другом классе) см код:

public class FireworkComponent extends JComponent {

private static final long serialVersionUID = 6733926341300224321L;
private double time;

public FireworkComponent(){
time=0;
}
@Override
protected void paintComponent(Graphics g) {
    super.paintComponent(g);

    g.translate(0, this.getHeight());

    Firework f= new Firework(this.getWidth()/2,0,73,90,Color.red,5);
    f.addFirework(75,35,Color.BLUE,6);
    f.addFirework(75, 155, Color.green, 6);

    time+=.1;

    Point point=f.addTime(.1);
    g.fillOval(point.x, (-point.y),15,15);

    try{
        Thread.sleep(500);
        System.out.println("sleep");
    }
    catch (InterruptedException e){
        e.printStackTrace();
    }

    this.repaint();
}
}

Ответы [ 3 ]

2 голосов
/ 03 октября 2011

пожалуйста

  • не добавляйте Firework f= new Firework(this.getWidth()/2,0,73,90,Color.red,5); внутри Paint Graphics2D, вы должны подготовить это до

  • не откладывайте рисование с помощью Thread.sleep(int);, для Graphics2D есть javax.swing.Timer, но вы должны инициализировать paintComponent() с помощью таймера, а не останавливаться для рисования внутри тела Paint

  • не уверен, что как-то работает Point point=f.addTime(.1);

EDIT

для анимации есть пример

2 голосов
/ 03 октября 2011

Сохраните Firework как атрибут уровня класса и создайте его экземпляр в конструкторе FireworkComponent.

2 голосов
/ 03 октября 2011

Прежде всего избавьтесь от Thread.sleep () из метода paintComponent ().

Затем необходимо определить свойства компонента Firework, которые со временем меняются.

НаконецВы бы использовали таймер Swing, чтобы запланировать анимацию фейерверка.Каждый раз, когда срабатывает таймер, вы обновляете свойства компонента и затем вызываете repaint () для компонента.

...