How to set up a proper game loop and draw to it

I am reading killer game programming in java and reffering to foriegnguymike on youtube. I think my game loop is ok but someone said not to use thread.sleep() and i’ll work on it. For now based on that youtuber I’m trying to draw the player using its’ methods. Anything unprofessional please point out because I’m new to advanced game programming with loops. I’ll show you my classes and PLEASE criticize by explaining what I did wrong, what I can correct and how I can draw an image from a resource folder. I really need to understand how to draw images in this gameloop.

Main Class:

import javax.swing.JFrame;

public class Game {

	public static void main(String[] args) {
		JFrame f = new JFrame();
		f.setTitle("OMG I MADE A GAME");
		f.setResizable(true);
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		f.setContentPane(new Panel());
		f.pack();
		
		f.setVisible(true);
	}

}

JPanel class with gameloop:


import java.awt.*;
import java.awt.image.BufferedImage;
import java.awt.event.*;

import javax.swing.JPanel;

import com.game.entity.Player;




public class Panel extends JPanel 
	implements Runnable, KeyListener{
	
	//game objects
	private Player p;///////////new Player
	
	// dimensions
	public static final int WIDTH = 320;
	public static final int HEIGHT = 240;
	public static final int SCALE = 2;
	
	// game thread
	private Thread thread;
	private boolean running;
	
	// image
	private BufferedImage image;
	private Graphics2D g;
	
	public Panel() {
		super();
		setPreferredSize(new Dimension(WIDTH * SCALE, HEIGHT * SCALE));
		setFocusable(true);
		requestFocus();
	}
	// DRAWS PANEL TO FRAME
	public void addNotify() {
		super.addNotify();
		if(thread == null) {
			thread = new Thread(this);
			addKeyListener(this);
			thread.start();
		}
	}
	
	private void init() {
		
		image = new BufferedImage(
					WIDTH, HEIGHT,
					BufferedImage.TYPE_INT_RGB
				);
		g = (Graphics2D) image.getGraphics();
		
		running = true;
		p.init();
		p = new Player(100, 100);
	}
	
	public void run() {
		
		init();
		
		// game loop
		while(running) {
			
			update();
			draw();
			p.draw(g);
			drawToScreen();			
			
			try {
				Thread.sleep(10);
			}
			catch(Exception e) {
				e.printStackTrace();
			}
			
		}
		
	}
	
	private void update() {
		p.update();
	}
	private void draw() {
		p.draw(g);
	}
	private void drawToScreen() {
		Graphics g2 = getGraphics();
		g2.drawImage(image, 0, 0,
				WIDTH * SCALE, HEIGHT * SCALE,null);
		
		g.drawString("2014 Jay H.", 10, 230);
		g2.dispose();
	}
	
	public void keyTyped(KeyEvent key) {}
	
	// PUBLIC KEYRELEASES
	public void keyPressed(KeyEvent key) {
		
	}
	// PUBLIC KEYRELEASES
	public void keyReleased(KeyEvent key) {

	}

}

Player class :


import java.awt.Graphics2D;
import java.awt.Image;

import javax.swing.ImageIcon;

public class Player {
	
	// PLAYER CORDINATES AND VELOCITY
	int x,y,dx,dy;
	
	
	// PLAYER IMAGE
	private Image PImg; 
	
	public Player(int x, int y) {
				
	}
	
	public void init() {//////////////////////////// How to get image from resource folder
		//GET IMAGE OF PLAYER IN THE SAME PACKAGE
		ImageIcon i = new ImageIcon(this.getClass().getResource("playersprites.gif"));
		PImg = i.getImage();
	}
	
	public void update() {
		this.x += dx;
		this.y += dy;
	}
	
	// DRAW TO PANEL CLASS
	public void draw(Graphics2D g) {
		g.drawImage(PImg, x, y, null);
	}
	
	//GET METHODS FOR CORDINATES AND VELOCITY  (Unused for now... i think)
	public void getX() {}
	public void getY() {}
	public void getDX() {}
	public void getDY() {}

}

Also point me out to some good game loop tutorials that explains how to add graphics :persecutioncomplex: