Criando Snake usando Java

Eu decidi recriar o Snake usando Java, mas estou meio que preso. No momento, tenho um quadrado que o usuário pode mover pela tela usando as teclas de seta. Quando você pressiona ESQUERDA uma vez, o quadrado começa a se mover para a esquerda usando um timer. Você não precisa segurar a tecla ou continuar pressionando; ele muda de direção quando você pressiona qualquer uma das outras teclas que estão definidas (Direita, Cima, Baixo). Meu objetivo é usar uma ArrayList para manter os quadrados que compõem a cobra. No momento, eu criei um ArrayList com apenas um objeto Snake dentro, se eu adicionar um segundo objeto Snake à lista e adicioná-lo ao quadro (com o primeiro), apenas um objeto Snake estará visível e as chaves para mover não funciona. Eu estou procurando algumas idéias de como eu posso progredir com este projeto - por favor não me dê a resposta completa, porque eu gostaria de descobrir a maior parte disso sozinha; Eu só preciso de uma direção. Agradecemos antecipadamente - o código está abaixo.

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Snake extends JPanel implements KeyListener, ActionListener
{
int x = 0, y = 0, velx = 0, vely = 0;
Timer t = new Timer(250, this);


public Snake(int num1, int num2)
{
    t.start();
    addKeyListener(this);
    setFocusable(true);
    setFocusTraversalKeysEnabled(true);
    x = num1;
    y = num2;
}
public void paintComponent(Graphics g)
{   
    super.paintComponent(g);

    g.setColor(Color.blue);
    g.fillRect(x, y, 20, 20);
}
public void actionPerformed(ActionEvent e)
{
    repaint();
    x += velx;
    y += vely;
}
public void up()
{
    vely = -20;
    velx = 0;
}
public void down()
{
    vely = 20;
    velx = 0;
}
public void left()
{
    vely = 0;
    velx = -20;
}
public void right()
{
    vely = 0;
    velx = 20;
}
public void keyPressed(KeyEvent e)
{
    int code = e.getKeyCode();

    if(code == KeyEvent.VK_UP)
        up();
    else if(code == KeyEvent.VK_DOWN)
        down();
    else if(code == KeyEvent.VK_RIGHT)
        right();
    else if(code == KeyEvent.VK_LEFT)
        left();

}
public void keyReleased(KeyEvent e)
{

}
public void keyTyped(KeyEvent e)
{

}
}
//Driver Class
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
import java.util.*;

public class UserClass
{
private static JFrame frame = new JFrame("Snake");
private static ArrayList<Snake> mySnake = new ArrayList<Snake>();

public static void main(String[] args)
{
    frame.setSize(500,500);
    frame.setBackground(Color.black);
    frame.setVisible(true);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    mySnake.add(new Snake(20,20));
    frame.add(mySnake.get(0));
}
}

P.S Quando eu coloco esse mesmo código exato no Eclipse no meu Mac, o fundo do meu quadro é preto, mas no Windows é cinza claro ... Alguém sabe por quê? Obrigado.

questionAnswers(3)

yourAnswerToTheQuestion