У меня есть некоторый код, который я написал для забавы, который рисует линии кругов разными цветами. Без использования Swing Timer круги нарисованы «все сразу», и они чередуют цвет между красным, зеленым, синим и желтым. Итак, без таймера код работает как положено. Однако, когда я пытаюсь анимировать так, чтобы я мог видеть нарисованные круги, что означает использование таймера качания для цикла вместо цикла while / for, все круги имеют одинаковый цвет и продолжают мигать вместе четырьмя цветами. Я предполагаю, что проблема в том, что цвет связан не с каждым объектом, а со всем кадром, так как я меняю цвет рамки каждые несколько миллисекунд. Круги, которые уже нарисованы, не остаются с их первоначальным цветом, как это было свремя цикла. Если вы видите какое-либо решение для этого, помощь будет принята с благодарностью! Вот код:
public class Board extends JPanel {
private static final long serialVersionUID = 6676924870723702476L;
private Timer timer;
private final int DELAY = 30;
private ActionListener drawLine;
private Ellipse2D circ;
private ArrayList<Ellipse2D> circles = new ArrayList<>();
private double circDiam = 80;
private double circX = 0;
private double circY = 0;
private short circNum = 1;
public Board() {
drawLine = (ActionEvent e) -> {
repaint();
circX += circDiam;
if(circNum == 5)
{
circNum = 1;
}
};
timer = new Timer(DELAY, drawLine);
timer.start();
}
private Color getCircColor(short circNum) {
switch(circNum) {
case 1:
return Color.blue;
case 2:
return Color.red;
case 3:
return Color.yellow;
case 4:
return Color.green;
default:
return Color.gray;
}
}
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Dimension size = new Dimension(getWidth(), getHeight());
double width = size.getWidth();
double height = size.getHeight();
Graphics2D g2d = (Graphics2D) g;
RenderingHints rHints = new RenderingHints(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
rHints.put(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
g2d.setRenderingHints(rHints);
if(circX >= width - circDiam)
{
circY += circDiam;
circX = 0;
circDiam *= 0.865 ;
}
if(circY >= height - circDiam) {
timer.stop();
}
circ = new Ellipse2D.Double(circX, circY, circDiam, circDiam);
g2d.setColor(getCircColor(circNum));
circNum++;
circles.add(circ);
for(Ellipse2D circ : circles) {
g2d.fill(circ);
}
}
}
public class Execute extends JFrame {
private static final long serialVersionUID = -3483390877436935589L;
public Execute() {
add(new Board());
setSize(800, 800);
setResizable(false);
setLocationRelativeTo(null);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
public static void main(String[] args) {
EventQueue.invokeLater(() -> {
Execute ex = new Execute();
ex.setVisible(true);
});
}
}