Что я в итоге сделал, так это то, что ListCellRenderer использует хеш-карту для отслеживания хода анимации для каждой песни. Анимация в основном просто увеличивает высоту JComponent, который ListCellRenderer возвращает с 0 до 100, и когда вставляется новый элемент, запускается таймер, который продолжает вызывать метод перекраски, пока анимация не завершится. У меня было все это с самого начала, но главное, чтобы анимация не работала, пока я не заменил ListCellRenderer новым на каждой итерации.
public void actionPerformed(ActionEvent event) {
cards.setCellRenderer(new ItemRenderer(cardsPane));
repaint();
if(animation.done){
timer.stop()
}
}