import javax.swing.*; import java.awt.*; public class CreditsPanel extends JPanel { private JList creditsList; private JScrollPane scrollPane; private Timer timer; private int scrollPos = 0; public CreditsPanel(String[] data, Runnable onComplete) { setLayout(new BorderLayout()); setBackground(Color.BLACK); //JList creditsList = new JList<>(data); creditsList.setBackground(Color.BLACK); creditsList.setForeground(Color.WHITE); creditsList.setFont(new Font("SansSerif", Font.BOLD, 20)); creditsList.setFixedCellHeight(40); // Consistent spacing DefaultListCellRenderer renderer = (DefaultListCellRenderer) creditsList.getCellRenderer(); renderer.setHorizontalAlignment(SwingConstants.CENTER); //ScrollPane scrollPane = new JScrollPane(creditsList); scrollPane.setBorder(null); scrollPane.getVerticalScrollBar().setPreferredSize(new Dimension(0, 0)); // Hidden bar add(scrollPane, BorderLayout.CENTER); //Animation timer = new Timer(30, e -> { JScrollBar vertical = scrollPane.getVerticalScrollBar(); scrollPos++; vertical.setValue(scrollPos); // Add a buffer (e.g., 100 pixels) to the finish check // to keep it on screen longer if (scrollPos >= (vertical.getMaximum() - vertical.getVisibleAmount()) + 100) { timer.stop(); onComplete.run(); } }); // Skip Button JButton skip = new JButton("SKIP"); skip.addActionListener(e -> { timer.stop(); onComplete.run(); }); add(skip, BorderLayout.SOUTH); } public void start() { scrollPos = 0; timer.start(); } }