Как сделать плавное изменение цвета символов на Jpanel в Jframe?
И так, у меня есть мой код который рисует матрицу как в фильме, при чём я указал шанс на то, что цифра выпадает с большим процентом. Мой вопрос заключается в том что я хочу что-бы все символы были не статичными, а переливались. То есть когда символ доходит до верхней цветовой границы зелёного (255) он начинал темнеть (до 50). Так же я бы хотел что-бы это происходило где-то за 10 секунд (в одну сторону).
import javax.swing.*;
import java.awt.*;
import java.util.Random;
import static java.awt.FlowLayout.CENTER;
import static java.lang.Math.floorDiv;
public class BigProject extends JFrame {
public static void main(String[] args) {
var random = new Random();
var f = new JFrame();
f.getContentPane().setBackground(Color.BLACK);
f.setDefaultCloseOperation(EXIT_ON_CLOSE);
f.setUndecorated(true);
f.getContentPane().setLayout(new FlowLayout(CENTER, 0, 0));
var screenSize = Toolkit.getDefaultToolkit().getScreenSize();
var labelSize = new Dimension(100, 60);
var rw = screenSize.getWidth() / (int) labelSize.getWidth();
var rh = screenSize.getHeight() / (int) labelSize.getHeight();
var repeat = rw * rh;
var digit = new String[]{
"0", "1", "2", "3", "4", "5", "6", "7", "8", "9",
};
var letter = new String[]{
"a", "b", "c", "d", "f", "g", "h", "i", "j", "k",
"l", "m", "n", "o", "q", "r", "s", "t", "u", "y",
"x", "z"
};
for (var i = 0; i < repeat; i++) {
int a = random.nextInt(25);
if (a < 5) {
var number = random.nextInt(letter.length);
var label = getLabelG(labelSize, random, letter[number]);
f.add(label);
}
if (a >= 5) {
var number = random.nextInt(digit.length);
var label = getLabelG(labelSize, random, digit[number]);
f.add(label);
}
f.setExtendedState(Frame.MAXIMIZED_BOTH);
}
f.setVisible(true);
}
private static JLabel getLabelG(Dimension labelSize, Random random, String letter) {
var label = new JLabel(letter, SwingConstants.CENTER);
label.setPreferredSize(labelSize);
label.setFont(label.getFont().deriveFont(48.0F));
label.setForeground(new Color(0, 50 + random.nextInt(206), 0));
return label;
}
}