Trying to rewrite Snake - Snake eats itself
===

I got a (to me, at least) _very_ strange situation.  
I am trying to rewrite snake, and moving is going very well, only the snake is eating itself, although I am removing 1 segment, and adding 1 (x + 1 - 1 = x?) but the snake disappears, while the Arraylist keeps the same size (printing it).

The function to calculate the position of the snake (I think that is causing it):

	private void move() {
		System.out.println(position.size());
		Point toAdd = position.get(position.size() - 1);
		position.remove(0);
		if(dir == 1)
			toAdd.y -= 5;
		else if(dir == 2) 
			toAdd.x -= 5;
		else if(dir == 3)
			toAdd.x += 5;
		else if(dir == 4)
			toAdd.y += 5;
			
		if(toAdd.x < 0) toAdd.x = 150;
		else if(toAdd.x > 150) toAdd.x = 0;
		
		if(toAdd.y < 0) toAdd.y = 150;
		else if(toAdd.y > 150) toAdd.y = 0;
		position.add(toAdd);
	}

But, to make it a Self Contained Compilable Example:

    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import java.awt.Graphics;
    import java.awt.Point;
    import java.awt.event.*;
    import java.util.ArrayList;
    
    class Snake extends JPanel implements Runnable {
    	int x,y;
    	boolean horizontal;
    	ArrayList<Point> position = new ArrayList<Point>();
    	byte dir = 3;
    	
    	public Snake(JFrame parent) {
    		for(int i = 0; i < 5; i++)
    			position.add(new Point(i*5 + 10, 10));
    			
    		parent.addKeyListener(new KeyAdapter() {
    			public void keyPressed(KeyEvent e) {
    				byte change = dir;
    				switch (e.getKeyCode()) {
    					case KeyEvent.VK_DOWN:
    						change = 4;
    						break;
    					case KeyEvent.VK_UP:
    						change = 1;
    						break;
    					case KeyEvent.VK_LEFT:
    						change = 2;
    						break;
    					case KeyEvent.VK_RIGHT:
    						change = 3;
    						break;
    				}
    				
    				changeDirection(change);
    			}
    		});
    		System.out.println("starting thread");
    		new Thread(this).start();
    	}
    	
    	private void changeDirection(byte change) {
    		if(change != dir && (change - 2 != dir || change + 2 != dir)) {
    			dir = change;
    		}
    	}
    	
    	public void run() {
            for(int i = 0; i != -1; i++){
    			try {
    				move();
    				this.repaint();
    				Thread.sleep(1000);
    			}
    			catch (InterruptedException e) {
    				System.out.println("INTERRUPTED");
    			}
            }
    	}
    	
    	private void move() {
    		System.out.println(position.size());
    		Point toAdd = position.get(position.size() - 1);
    		position.remove(0);
    		if(dir == 1)
    			toAdd.y -= 5;
    		else if(dir == 2) 
    			toAdd.x -= 5;
    		else if(dir == 3)
    			toAdd.x += 5;
    		else if(dir == 4)
    			toAdd.y += 5;
    			
    		if(toAdd.x < 0) toAdd.x = 150;
    		else if(toAdd.x > 150) toAdd.x = 0;
    		
    		if(toAdd.y < 0) toAdd.y = 150;
    		else if(toAdd.y > 150) toAdd.y = 0;
    		position.add(toAdd);
    	}
    	
    	public void paintComponent(Graphics g) {
    		g.clearRect(0,0,150,150);
    		for(Point p : position)
    			g.drawRect(p.x, p.y, 5, 5);
    	}
    	
    	public static void main(String[] args) {
    		Snake snake;
    		JFrame f = new JFrame("Snake");
    		f.setSize(150, 150);
    		f.add((snake = new Snake(f)));
    		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		f.setResizable(false);
    		f.setVisible(true);
    	}
    }

Movement was the first thing I tried to implement, I have not yet come to collision-detection/food, that's not the question here.

My question is:  

**Why is the snake shrinking while the arraylist isn't and how can I fix it, i.e. make the snake move like it's supposed to in a Snake-game?**