I am having a couple of problems with my code. First, whenever I try to remove the JOptionPane from line 79 in my code, I get a NullPointerException from the line this.dbGraphics = this.dbImage.getGraphics(); a couple of lines down from the JOptionPane. Does anyone know why? Another problems is that I tried to convert this applet into a application program, and whenever I did so, I lost all of the score/info from the top of the screen. It's still there, but not all of it is visible for some reason. Why is that? Also, the main purpose of this project is to create a networked pong game. I want to create two other classes, hostpong and clientpong where the host holds all of the game logic, sends its paddle and ball location to the client, the client simply draws everything, and sends its paddle location back to the host (using udp datagram packets). Is this the best way to implement this? I will take any help, advice, code that you are willing to provide. Thank you for any help you may give!

*Need help resolving NullPointException, turning applet into proper application (w/out errors), networking.

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Random;
import java.io.*;
import java.awt.*;
import java.util.*;
import java.applet.*;
import javax.swing.*;
import java.awt.event.*;  
import javax.swing.event.*;
import javax.swing.JApplet;
 
public class SinglePlayer
extends JFrame 
implements KeyListener {
	// just a random variable to randomize some things
	static Random rand = new Random(System.currentTimeMillis());
 
	// the width & height for our applet
	public static int width = 500, height = 500;
	// will the user be playing against the computer or a person
	//public boolean twoPlayers = false;
	// is the game paused
	boolean paused = true;
	// what is the top boundary
	int top = 20;
	// information to be displayed
	static String info = "TECHNO PONG";
	static String pause1 = "blue player use a/z";
	static String pause2 = "red player use k/m";
	static String pause3 = "p to pause";
	// font to display normal info
	Font defFont = new Font("arial", 0, 12);
 
	// double buffering stuff
	Image dbImage;
	Graphics dbGraphics;
 
	// the ball
	Ball ball = new Ball(this, width/2, height/2, 2, 2, top, height);
 
	// the paddles
	Paddle leftPaddle = new Paddle(Paddle.TYPE_LEFT, 5, 
			height/2, top, height, 'a', 'z');
	Paddle rightPaddle = new Paddle(Paddle.TYPE_RIGHT, 
			width-Paddle.width-5, height/2, top, height, 'k', 'm');
 
	// scores
	int leftScore=0;
	int rightScore=0;
	// font used to display score
	Font scoreFont = new Font("Arial", 0, 18);
 
	/**
	 * Initialize method, it will start up pong
	 * and keep it going.
	 */
 
	public SinglePlayer()
	{
		init();
		setSize(width, height);
		setVisible(true);
		setResizable(false);
	}
	public void init() {
		// ask the user if they want to play against the computer
		int option = JOptionPane.showConfirmDialog(this, 
				"placeholder", 
				"Competition", JOptionPane.OK_OPTION);
 
		// set the size and background color
		this.setSize(width, height);
		this.getContentPane().setBackground(Color.black);
 
		// create the double buffering images/graphics
		this.dbImage = this.createImage(width, height);
		this.dbGraphics = this.dbImage.getGraphics();
 
		// give ability to catch keyboard input
		this.addKeyListener(this);
 
		// a new thread that keeps on updating our applet
		new Thread() {
			public void run() {
				while(true) {
					// do if paused
					if(!paused) {
						// update and paint our game often
						updatePong();
						paint(getGraphics());
						pause(5);
					} else {
						// paint our game only, we are paused
						paint(getGraphics());
						pause(100);
					}
				}
			}
		}.start();
	}
 
	/* updates the game */
	public void updatePong() {
		updateBall();
		updatePaddles();
	}
 
	/* update our ball */
	public void updateBall() {
		checkBallWithPaddle(ball, leftPaddle);
		checkBallWithPaddle(ball, rightPaddle);
		ball.update();
	}
 
	/* check to see if the given ball collided with the given paddle */
	public  void checkBallWithPaddle(Ball ball, Paddle paddle) {
		// make some temp variables for easy referencing
		int bx = ball.xLoc, by = ball.yLoc, bs = ball.size;
		int px = paddle.xLoc, py = paddle.yLoc;
		int pw = Paddle.width, ph = Paddle.height, sec = ph/5;
 
		boolean ballCollided=false;
 
		if(paddle.myType == Paddle.TYPE_LEFT) {
			if(isWithin(px, px+pw, bx, 0) && isWithin(py, py+ph, by, bs)) {
				ballCollided = true;
				ball.xLoc = px+pw;
			}
		} else {
			if(isWithin(px, px+pw, bx+bs, 0) && isWithin(py, py+ph, by, bs)) {
				ballCollided = true;
				ball.xLoc = px-bs;
			}
		}
 
		if(ballCollided) {
			// bounce the ball
			ball.bounceX();
 
			// randomize the bounce a little
			int change = rand.nextInt(4);
			int change2 = rand.nextInt(2)-1;
 
			// depending on where the ball hit the paddle
			// change the velocity a little
			if(by<=py+sec)
				ball.yVel -= change;
			else if(by<=py+(2*sec))
				ball.yVel -= (change/2);
			else if(by >= py+(3*sec))
				ball.yVel += (change/2);
			else if(by >= py+(4*sec))
				ball.yVel += change;
			else
				ball.yVel += change2*change;
		}
	}
 
	// check if the targed is within the given range with size buffer
	public static boolean isWithin(int min, int max, int target, int size) {
		if(min > max) {
			int temp = min;
			min = max;
			max = temp;
		}
 
		if(target+size>=min && target<=max)
			return true;
		return false;
	}
 
	public void updatePaddles() {
		leftPaddle.update();
 
		// pick which update to do, user or ai
		if(PongGui.twoplayers)
			rightPaddle.update();
		else
			rightPaddle.aiUpdate(ball);
	}
 
	/* paint function */
	public void paint(Graphics g) {
		super.paint(dbGraphics);
 
		drawBall();
		drawPaddles();
		drawScore();
		drawBoard();
		drawInfo();
		if(paused)
			drawPause();
 
		// update our screen
		update(g);
	}
 
	public void drawBall() {
		dbGraphics.setColor(Color.white);
		dbGraphics.fillOval(ball.xLoc, ball.yLoc, ball.size, ball.size);
	}
 
	public void drawPaddles() {
		dbGraphics.setColor(Color.blue);
		dbGraphics.fillRect(leftPaddle.xLoc, leftPaddle.yLoc, 
				Paddle.width, Paddle.height);
 
		dbGraphics.setColor(Color.red);
		dbGraphics.fillRect(rightPaddle.xLoc, rightPaddle.yLoc, 
				Paddle.width, Paddle.height);
	}
 
	public void drawScore() {
		dbGraphics.setFont(scoreFont);
		dbGraphics.setColor(Color.blue);
		dbGraphics.drawString(""+leftScore, 10, top-1);
 
 
		dbGraphics.setColor(Color.red);
		dbGraphics.drawString(""+rightScore, width-50, top-1);
	}
 
	public void drawBoard() {
		dbGraphics.setColor(Color.white);
		dbGraphics.drawLine(0, top, width, top);
	}
 
	public void drawInfo() {
		dbGraphics.setColor(Color.white);
		dbGraphics.setFont(scoreFont);
		dbGraphics.drawString(info, (width/2)-50, top-5);
	}
 
	public void drawPause() {
		dbGraphics.setFont(defFont);
		int x = width/2;
		int y = top+30;
		dbGraphics.setColor(Color.blue);
		dbGraphics.drawString(pause1, x-48, y-15);
		dbGraphics.setColor(Color.red);
		dbGraphics.drawString(pause2, x-48, y);
		dbGraphics.setColor(Color.white);
		dbGraphics.drawString(pause3, x-28, y+15);
	}
 
	public void update(Graphics g) {
		if(g == null)
			return;
		g.drawImage(this.dbImage, 0,0, this);
	}
 
	// gets called whena key is pressed
	public void keyPressed(KeyEvent e) {
		//send the key press to each of the paddles
		leftPaddle.handleKey(e.getKeyChar(), true);
		rightPaddle.handleKey(e.getKeyChar(), true);
	}
 
	// gets call when a key is released
	public void keyReleased(KeyEvent e) {
		// pause the game if need be
		if(e.getKeyChar() == 'p')
			paused = !paused;
 
		// send the signal to each of the paddles
		leftPaddle.handleKey(e.getKeyChar(), false);
		rightPaddle.handleKey(e.getKeyChar(), false);
	}
 
	// the ball went out
	public void ballOut(boolean outAtRight) {
		// on the left side
		if(ball.xLoc < 10)
			rightScore++;
		else// on the right side
			leftScore++;
 
		// reset the ball
		ball.reset();
 
		// pause the game
		paused = true;
	}
 
	// do nothing on type
	public void keyTyped(KeyEvent e) {;}
 
	// makes the program sleep for a little bit
	public static void pause(long millis) {
		try{Thread.sleep(millis);}
		catch(Exception e) {;}
	}
 
	public static void main(String[] args)
	{
		new SinglePlayer();
	}
}