#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. Это то, что я предлагал.