Game lagging horribly

My game is lagging horribly… I’m running it on a timer, and once I get to about 15 enemies on the screen, it lags. Does anyone have any suggestions? Sorry for bad code, I’m a fairly new programmer.

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Random;
import javax.swing.ImageIcon;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.Timer;

public class GameFrame extends JPanel implements ActionListener {

	Timer mainTimer;
	Player player;

	public static int level = 1;

	static ArrayList<Enemy> enemies = new ArrayList<Enemy>();
	static ArrayList<Missile> missiles = new ArrayList<Missile>();

	Random rand = new Random();

	// starts the game timer and starts the game
	public GameFrame() {
		setFocusable(true);
		player = new Player(150, 450);
		addKeyListener(new KeyAdapt(player));

		mainTimer = new Timer(10, this);
		mainTimer.start();

		startGame();

	}

	// paints the images to the game window
	public void paint(Graphics g) {
		super.paint(g);
		Graphics2D g2d = (Graphics2D) g;

		// draws the background
		ImageIcon bg = new ImageIcon(getClass().getResource("background.png"));
		g2d.drawImage(bg.getImage(), 0, 0, null);

		// draws the stats and upgrade panels
		ImageIcon stats = new ImageIcon(getClass().getResource("stats.png"));
		g2d.drawImage(stats.getImage(), 530, 0, null);

		ImageIcon ug = new ImageIcon(getClass().getResource("upgrades.png"));
		g2d.drawImage(ug.getImage(), 530, 250, null);

		player.draw(g2d);

		for (int i = 0; i < enemies.size(); i++) {
			Enemy tempEnemy = enemies.get(i);
			tempEnemy.draw(g2d);
		}

		for (int i = 0; i < missiles.size(); i++) {
			Missile m = missiles.get(i);
			m.draw(g2d);
		}

		// displays what level you are on, and your points
		g2d.drawString("Level :" + level, 550, 50);
		g2d.drawString("Enemy count: " + enemies.size(), 550, 70);
		g2d.drawString("Health :" + Player.health, 550, 90);
		g2d.drawString("Speed :" + Player.speed, 550, 110);
		g2d.drawString("Missile Count :" + Player.missileCount, 550, 130);
		g2d.drawString("Damage :" + Player.missilePower, 550, 150);

		// displays the upgrades available and how much they cost
		// speed
		g2d.drawString("1: +1 Speed", 535, 320);
		g2d.drawString("" + Player.speed * 10, 620, 320);
		// health
		g2d.drawString("2: " + (Player.healthpool + 5) + " health", 535, 340);
		g2d.drawString("" + Player.healthpool * 10, 620, 340);
		// missileCount
		g2d.drawString("3: +1 missile", 535, 360);
		g2d.drawString("" + Player.missileCount * 3, 620, 360);
		// missilePower
		g2d.drawString("4: +1 Damage", 535, 380);
		g2d.drawString("" + Player.missilePower * 6, 620, 380);
		// points
		g2d.drawString("Points :" + Player.points, 535, 400);
		//instructions
		g2d.drawString("Instructions: press", 535, 410);
		g2d.drawString("the corresponding", 535, 420);
		g2d.drawString("number on the left", 535, 430);
		g2d.drawString("to upgrade.", 535, 440);

	}

	// controls actions, checks if game has ended
	public void actionPerformed(ActionEvent arg0) {
		player.update();

		for (int i = 0; i < enemies.size(); i++) {
			Enemy tempEnemy = enemies.get(i);
			tempEnemy.update();
		}

		for (int i = 0; i < missiles.size(); i++) {
			Missile m = missiles.get(i);
			m.update();
		}

		checkEnd();
		repaint();
		try{
			Thread.sleep(20);
		}catch(InterruptedException ex){}
	}

	// adds enemies
	public void addEnemy(Enemy e) {
		enemies.add(e);
	}

	// removies enemies
	public static void removeEnemy(Enemy e) {
		enemies.remove(e);
	}

	// arraylist to store the number of enemies
	public static ArrayList<Enemy> getEnemyList() {
		return enemies;
	}

	// adds missiles
	public static void addMissile(Missile m) {
		missiles.add(m);
	}

	// removes missiles
	public static void removeMissile(Missile m) {
		missiles.remove(m);
	}

	// arraylist to store the number of missiles
	public static ArrayList<Missile> getMissileList() {
		return missiles;
	}

	// starts the game, loads up enemies
	public void startGame() {
		int enemyOneCount;
		int enemyTwoCount;

		enemyOneCount = level * 2;
		enemyTwoCount = level - 9;
		for (int i = 0; i < enemyOneCount; i++) {
			addEnemy(new EnemyOne(rand.nextInt(400), -10 + -rand.nextInt(600)));
		}
		if (level >= 10) {
			for (int i = 0; i < enemyTwoCount; i++) {
				addEnemy(new EnemyTwo(rand.nextInt(400), -10+ -rand.nextInt(600)));
			}
		}
	}

	// checks if the level is over
	public void checkEnd() {
		if (enemies.size() == 0) {
			if (Player.health > 0) {
				level++;
				enemies.clear();
				missiles.clear();
				startGame();
			} else {
				JOptionPane.showMessageDialog(null,"You lose! You made it to level " + level);
				System.exit(0);
			}
		}
	}
}