Moving logic in game loop

In my way to build my first game, I’m trying to move my character.
I don’t know if it’s the right way to do it, but basically I’m using a timer inside a run method and the game loop inside the actionlistener.
Even debugging, I don’t know why it doesn’t move.

public synchronized void start (){
		running = true;
		t1 = new Thread (this);
		t1.start();
		
		}
 
	
	public synchronized void stop (){
		running  = false;
		try {
			t1.join();
			System.out.println("The game stopped");
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	//INIT
	public Panel(){
		
		setPreferredSize(new Dimension(WIDTH, HEIGHT));
		setFocusable(true);
		addKeyListener(this);
		requestFocus();
		load();
		
		
		
	}
	
	ActionListener gameloop = new ActionListener() {
		
		@Override
		public void actionPerformed(ActionEvent e) {
			go();
			repaint();
			System.out.println("The game runs");
		}
	};
	
	
	
	//MAIN PROCESS
	
	public void run(){
		
		Timer timer = new Timer(1000/60,gameloop);
		timer.start();
		
		try {
			Thread.sleep(1000/60);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
				
	}
	
	
	//PAINT IMAGES
	public void paintComponent (Graphics g){
		super.paintComponent(g);
		g.drawImage(sfondo, 0, 0, this);
		g.drawImage(boaris, cordX, cordY, this);
		
	
	}
	
	//LOADS
	public void load (){
				try {
			String sfondopath = "res/sfondo.png";
			sfondo = ImageIO.read(new File (sfondopath));
			String imgpath = "res/img.png";
			img = ImageIO.read(new File (imgpath));
		} catch (IOException e) {
			
			e.printStackTrace();
		}
				
	}


	
	public void go(){
		cordX += vX;
		cordX += vY;
       
	}
	
	public void gameupdate(){
		vX=0;
		vY=0;
		if (down) vY = speed;
		if (up) vY = -speed;
		if (left) vX = -speed;
		if (right) vX = speed;
	}
	

	
	public void keyPressed(KeyEvent ke) {
		 switch (ke.getKeyCode()) {
         //if the right arrow in keyboard is pressed...
         case KeyEvent.VK_RIGHT: {
             right = true;
         }
         break;
         //if the left arrow in keyboard is pressed...
         case KeyEvent.VK_LEFT: {
             left = true;
         }
         break;
         //if the down arrow in keyboard is pressed...
         case KeyEvent.VK_DOWN: {
             down = true;
         }
         break;
         //if the up arrow in keyboard is pressed...
         case KeyEvent.VK_UP: {
             up = true;
         }
         break;
     }
     gameupdate();
	}

Ok, it moves, by simply putting the timer in the init part.
But now I’m not using threads anymore!
I know my code is messy, but how can I put all the stuff back in the run method, using a separate thread for the game loop?

Use a game library, like LibGDX or Slick2D to take care of the game loop and core engine stuff for you. That’s my suggestion.

I think you should take a look at this tutorial to see some different implementations of game loops and how they work. Then I’d use one of the good loops from that tutorial as an example for a way to structure your game loop.