Making a grid-based game? Follow the instructions on this page.
Making a simple graphical project that is not based on a grid? Download this starter code.
Making a project with lots of moving sprites, not based on a grid? Start from the Sprite Lab.
(And here are some notes on inheritance.)
Making a project where the user will draw on the screen? Download this starter code.
Want a simple example where the computer will draw on the screen? Download this file.
Using 3-D graphics? Read these instructions.
Making a networking project? Download this starter code.
(Later, you can use this FakeServer.jar to test your client-side code
and this FakeClient.jar to test your server-side code.)
Looking for other useful stuff in Java? Here's what you'll find on this page:
Main method
Random int
Exceptions
Convert between int and String
Test if a String represents an integer
User input
Wait for user to press enter
Load from a text file
Save to a text file
Wait
Time something
Threads
Exit the program
GUI (graphical user interface)
Pop-Up Dialogs
Custom Dialogs
Drawing
Draw Text
Draw an image
Rotate an image
Get pixel color from an image
Animation
Gravity: jumping and falling
Mouse Input
Keyboard Input
Smooth movement with keyboard input
Sound
Networking: Client
Networking: Server
Executable JAR File
public static void main(String[] args)
{
}
int n = (int)(Math.random() * howManyPossibleValues) + lowestPossibleValue;
There are 2 kinds of exceptions in Java: run-time and compile-time. Run-time exceptions occur when a program crashes. For example:
int n = 3 / 0;
This code compiles successfully, but crashes with an ArithmeticException.
You can use the throw instruction to force your program to crash. (Forcing your program to crash immediately in the event of an error condition is much better than ignoring the error condition and allowing the program to continue running.) This code will compile successfully, but will crash at run-time.
if (numTimes < 0)
throw new RuntimeException("cannot be negative");
You can prevent your code from crashing by detecting when an exception occurs.
try
{
doStuff();
System.out.println("It worked!");
}
catch(SomeKindOfException e)
{
System.out.println("It failed.");
}
Compile-time exceptions (such as IOException) must be handled by your program or your code won't even compile. There are two ways to handle a compile-time exception. One way is to catch it, as shown above. The other is to declare that your method throws the exception.
public static void save() throws IOException
{ ... }
Of course, now whoever calls save will need to handle this exception.
String s = 3 + "";
int n = Integer.parseInt("3");
try
{
int n = Integer.parseInt(s);
System.out.println("integer");
}
catch(NumberFormatException e)
{
System.out.println("not an integer");
}
import java.util.*; // for Scanner
...
Scanner in = new Scanner(System.in); // only once per program
System.out.print("Enter first name: ");
String first = in.nextLine();
System.out.print("Enter last name: ");
String last = in.nextLine();
new java.util.Scanner(System.in).nextLine();
import java.io.*; // for BufferedReader, FileReader
...
BufferedReader in = new BufferedReader(new FileReader("file.txt"));
String line = in.readLine();
while (line != null)
{
System.out.println(line);
line = in.readLine();
}
in.close();
import java.io.*; // for PrintWriter, FileWriter
...
PrintWriter out = new PrintWriter(new FileWriter("file.txt"), true);
out.println("first line");
out.println("second line");
out.close();
// before waiting
try { Thread.sleep(500); } catch(Exception e) { }
// half a second later
long start = System.currentTimeMillis();
...
long millisecondsElapsed = System.currentTimeMillis() - start;
This class extends Thread and overrides its run method to print forever.
public class MyThread extends Thread
{
public void run()
{
while (true)
System.out.println("running");
}
}
The following code creates the thread and runs it, and then prints at the same time.
Thread t = new MyThread();
t.start();
while (true)
System.out.println("at the same time");
Consider the following code segment, which appears in some method.
a();
b();
Here's a quick and dirty way to rewrite this code so that methods a and b run at the same time:
new Thread()
{
public void run()
{
a();
}
}.start();
b();
System.exit(0);
import java.awt.event.*; // for ActionListener, ActionEvent
import javax.swing.*; // for JFrame, BoxLayout, JLabel, JTextField, JButton
public class GUI implements ActionListener
{
private JTextField field;
public GUI()
{
// make a window
JFrame frame = new JFrame();
frame.setTitle("My Window");
// tell window to place each new component under the previous ones
frame.getContentPane().setLayout(new BoxLayout(frame.getContentPane(), BoxLayout.PAGE_AXIS));
// add some text
frame.getContentPane().add(new JLabel("some text"));
// add a text field
field = new JTextField(25);
frame.getContentPane().add(field);
// add a button
JButton button = new JButton("a button");
frame.getContentPane().add(button);
// tell button to call this object's actionPerformed method when pressed
button.addActionListener(this);
// store text in button that can be retrieved in actionPerformed method
button.setActionCommand("button1");
frame.pack(); // determine best size for window
frame.setVisible(true); // show the window
}
public void actionPerformed(ActionEvent e)
{
// button was pressed
if (e.getActionCommand().equals("button1"))
{
// we now know which button was pressed
System.out.println("text field contains: " + field.getText());
}
}
}
You will need:
import javax.swing.*; // for JOptionPane
Dialog with OK button:
JOptionPane.showMessageDialog(parentComponent, "Hard drive erased");
Dialog with text field:
String name = JOptionPane.showInputDialog(parentComponent, "Enter your name");
Dialog with Yes/No/OK/Cancel buttons:
int selected = JOptionPane.showConfirmDialog(parentComponent,
"Are you sure?", "Confirm", JOptionPane.YES_NO_OPTION);
if (selected == JOptionPane.YES_OPTION)
...
Dialog with drop-down:
Object[] choices = {"blue", "green", "red", "yellow"};
Object selected = JOptionPane.showInputDialog(parentComponent, "What is your favorite color?",
"Color", JOptionPane.PLAIN_MESSAGE, null, choices, choices[0]);
Here is a complete example of a custom dialog.
public class SimpleDialog extends JDialog implements ActionListener
{
private JTextField field;
public SimpleDialog(Frame frame)
{
super(frame, true);
field = new JTextField(25);
field.addActionListener(this);
getContentPane().add(field);
pack();
setVisible(true);
}
public void actionPerformed(ActionEvent e)
{
setVisible(false);
}
public String getResult()
{
return field.getText();
}
}
This following code segment shows how to use the custom dialog.
SimpleDialog dialog = new SimpleDialog(frame);
String result = dialog.getResult();
import java.awt.*; // for Graphics
import javax.swing.*; // for JComponent, JFrame
public class Draw extends JComponent
{
public Draw()
{
JFrame frame = new JFrame();
setPreferredSize(new Dimension(400, 400));
frame.getContentPane().add(this);
frame.pack();
frame.setVisible(true);
}
public void paintComponent(Graphics g)
{
g.setColor(Color.WHITE);
g.fillRect(0, 0, getWidth(), getHeight());
g.setColor(Color.RED);
g.drawOval(100, 100, 200, 200);
}
}
In the paintComponent method:
g.setColor(Color.BLUE); // optional code to choose color before drawing text
g.setFont(new Font(null, Font.PLAIN, 24)); // optional code to change the font size
g.drawString("Hello", 10, 200); // places the bottom-left of the string at position (10, 200).
You will need:
import java.awt.image.*; // for BufferedImage
import java.net.*; // for URL
import javax.imageio.*; // for ImageIO
Create a fields for storing images:
private BufferedImage image;
Load images:
String fileName = "somefile.png";
URL url = getClass().getResource(fileName);
if (url == null)
throw new RuntimeException("file not found: " + fileName);
image = ImageIO.read(url);
In paintComponent method:
g.drawImage(image, x, y, null); // to draw image in its original size
g.drawImage(image, x, y, width, height, null); // to draw image in the given dimensions
Graphics2D g2 = (Graphics2D)g; // g is a Graphics object
AffineTransform old = g2.getTransform();
g2.rotate(angleInRadians, centerX, centerY); // rotate around center of image at (centerX, centerY)
g2.drawImage(image, leftX, topY, null); // (leftX, topY) is top left of image (before rotating)
g2.setTransform(old);
Color c = new Color(image.getRGB(x, y)); // where image is a BufferedImage
Create a class that extends JComponent. Store state in fields:
private int x;
In paintComponent method, what you draw should depend on state:
g.fillOval(x, 100, 10, 10);
Write a loop to change state and redraw:
while (true)
{
x++; // change state
repaint(); // ask JComponent to redraw when it has time
try { Thread.sleep(100); } catch(Exception e) { } // provide time to redraw
}
Declare fields to keep track of both position and velocity:
private double y;
private double vely;
Repeatedly change position and velocity, and redraw:
while (true)
{
y = y + vely; // change y coordinate by amount of velocity
vely = vely + 0.01; // change velocity by constant acceleration due to gravity
repaint();
try { Thread.sleep(10); } catch(Exception e) { }
}
To begin falling, set velocity to 0. To begin jumping, set velocity to a negative value:
vely = -10;
You will need:
import java.awt.event.*; // for MouseListener, MouseEvent
Create a class that extends JComponent and implements MouseListener. In the constructor, tell the component to notify itself of mouse events:
addMouseListener(this);
Implement each of the methods in MouseListener, such as:
public void mousePressed(MouseEvent e)
{
int x = e.getX();
int y = e.getY();
System.out.println("Pressed mouse button at: " + x + ", " + y);
}
(If you want to be notified every time the mouse moves, then you will need to implement MouseMotionListener.)
You will need:
import java.awt.event.*; // for KeyListener, KeyEvent
Create a class that extends JComponent and implements KeyListener. In the constructor, tell the component to notify itself of keyboard events:
setFocusable(true);
addKeyListener(this);
Implement each of the methods in KeyListener, such as:
public void keyPressed(KeyEvent e)
{
int key = e.getKeyCode();
System.out.println("Pressed key with code: " + key);
}
Create a field to remember whether a key is down, and initialize it to false.
private boolean rightKeyDown;
Set the field to true when the key is pressed and false when the key is released.
public void keyPressed(KeyEvent e)
{
int key = e.getKeyCode();
if (key == 39) //right arrow key
rightKeyDown = true;
}
public void keyReleased(KeyEvent e)
{
int key = e.getKeyCode();
if (key == 39) //right arrow key
rightKeyDown = false;
}
Repeatedly change coordinate values when the field is true.
while (true)
{
if (rightKeyDown)
x++;
repaint();
try { Thread.sleep(10); } catch(Exception e) { }
}
import java.io.*;
import javax.sound.sampled.*;
...
//load sound
Clip clip = (Clip)AudioSystem.getLine(new Line.Info(Clip.class));
clip.open(AudioSystem.getAudioInputStream(new File("beep.wav")));
...
//play sound
clip.setFramePosition(0);
clip.start();
This code throws 3 compile-time exceptions: LineUnavailableException, IOException, UnsupportedAudioFileException.
import java.io.*; // for BufferedReader, InputStreamReader, PrintWriter
import java.net.*; // for Socket
...
Socket socket = new Socket("localhost", 9000); // connect to server on port 9000
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
out.println("lowercase"); // send message to server
String line = in.readLine(); // wait for message from server
System.out.println(line); // print message from server
...
// disconnect from server
in.close();
out.close();
socket.close();
import java.io.*; // for BufferedReader, InputStreamReader, PrintWriter
import java.net.*; // for ServerSocket, Socket
...
ServerSocket server = new ServerSocket(9000); // start server on port 9000
while (true)
{
Socket socket = server.accept(); // wait for client to connect
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
String line = in.readLine(); // wait for message from client
out.println(line.toUpperCase()); // send message to client
// disconnect from client
in.close();
out.close();
socket.close();
}
From terminal/command, navigate to the root folder of your project, and write:
jar cvfe nameofjarfile.jar NameOfClassWithMainMethod *.class *.otherfileextensiontoinclude