Возникли проблемы с анимацией java

#java #swing #animation #timer #jframe

#java #swing #Анимация #таймер #jframe

Вопрос:

вот мой GUIPanel.java файл

 import java.awt.*;
import java.awt.event.*;
import java.util.Random;

public class GUIPanel extends JPanel implements ActionListener {
    static final int SCREEN_WIDTH = 800;
    static final int SCREEN_HEIGHT = 600;
    boolean running = false;
    Color startingColor;
    static final int delay = 120000;
    Timer timer;
    Random random;
    
    GUIPanel() {
        /*int color = random.nextInt(2);
        if(color == 0) {
            startingColor = Color.red; 
        }
        else {
            startingColor = Color.green;
        }*/
        this.setPreferredSize(new Dimension(SCREEN_WIDTH, SCREEN_HEIGHT));
        this.setBackground(Color.red);
        this.setFocusable(true);
        startSim();
    }

    public void startSim() {
        running = true;
        timer = new Timer(delay, this);
        timer.start();
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        draw(g);
    }

    public void draw(Graphics g) {
        //if(running) {
            if(this.getBackground() == Color.green) {
                this.setBackground(Color.red);
            }
            else {
                this.setBackground(Color.green);
            }
            //delay = delay / 2;
        //}
    }

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

итак, я попытался использовать как swing timer, так и java.util.timer, и оба результата дают один и тот же продукт, который представляет собой фон графического интерфейса, меняющий цвета, как стробоскоп. Я хочу, чтобы repaint вызывался каждые 2 минуты и, следовательно, менял фон каждые 2 минуты.

Ответ №1:

хорошо, теперь я понимаю, что функция рисования всегда зацикливается, поэтому мне нужно создать новый метод для изменения фона, чтобы время действительно работало.

 import java.awt.*;
import java.awt.event.*;
import java.util.Random;

public class GUIPanel extends JPanel implements ActionListener {
    static final int SCREEN_WIDTH = 800;
    static final int SCREEN_HEIGHT = 600;
    boolean running = false;
    Color startingColor;
    static final int delay = 120000;
    Timer timer;
    Random random;
    
    GUIPanel() {
        this.setPreferredSize(new Dimension(SCREEN_WIDTH, SCREEN_HEIGHT));
        this.setBackground(Color.red);
        this.setFocusable(true);
        startSim();
    }

    public void startSim() {
        running = true;
        timer = new Timer(delay, this);
        timer.start();
    }

    public void changeBackground() {
        if(this.getBackground() == Color.green) {
            this.setBackground(Color.red);
        }
        else {
            this.setBackground(Color.green);
        }
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        changeBackground();
    }
}
 

Комментарии:

1. Теперь я понимаю, что функция рисования всегда зацикливается — не совсем. Что происходит, так это то, что при вызове setBackground() компонент автоматически вызывает repaint() сам по себе, что вызывает метод paintComponent(), который, в свою очередь, вызывает ваш метод draw() . Итак, проблемы с вашим кодом: 1) метод рисования НЕ должен изменять свойство класса. Метод рисования должен отображать только текущее состояние класса

2. 2) нет необходимости в вашем методе draw() или переопределять метод paintComponent(). В вашем коде ActionListener все, что вам нужно сделать, это вызвать setBackground() метод, и компонент перерисует себя.

3. итак, я отредактировал код, «исправив» обе вещи, которые вы сказали, это то, что вы имеете в виду, просто удалите методы draw() и paintcomponent() и удалите repaint() из метода actionPerformed ?

4. Это то, что я предлагал.