Nicholas Creech
Nicholas Creech

Reputation: 49

Converting a Java Applet to an Application

I know this question has been answered elsewhere, but none of them seem to work. I don't know if the solution is different depending on the code, but that's what I'm guessing. Anyway, all I want to do is take this simple Applet (a Pong game) and change it to an Application. That's possible right? Thank you in advance! :)

package net.laserball.src;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.Shape;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.awt.event.WindowEvent;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Rectangle2D;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

import javax.swing.JApplet;
import javax.swing.JComponent;

public class LaserBallMain extends JApplet 
{
private static final long serialVersionUID = 1L;

public static final int WIDTH = 400;
public static final int HEIGHT = 400;

private PaintSurface canvas;

public void init()
{
    this.setSize(WIDTH, HEIGHT);
    canvas = new PaintSurface();
    this.add(canvas, BorderLayout.CENTER);

    ScheduledThreadPoolExecutor executor = 
        new ScheduledThreadPoolExecutor(3);
    executor.scheduleAtFixedRate(
        new AnimationThread(this), 
        0L, 20L, TimeUnit.MILLISECONDS);

}
}

class AnimationThread implements Runnable
{
JApplet c;

public AnimationThread(JApplet c)
{
    this.c = c;
}

public void run()
{
    c.repaint();
}
}

class PaintSurface extends JComponent
{
private static final long serialVersionUID = 1L;

int paddle_x = 0;
int paddle_y = 360;

int score = 0;

float english = 1.0F;

Ball ball;

Color[] color = {Color.RED, Color.ORANGE,
                 Color.MAGENTA, Color.ORANGE,
                 Color.CYAN, Color.BLUE};

int colorIndex;

public PaintSurface()
{
    addMouseMotionListener(new MouseMotionAdapter()
    {
        public void mouseMoved(MouseEvent e)
        {
            if(e.getX() - 30 - paddle_x > 5)
                english = -1.5F;
            else if (e.getX() - 30 - paddle_x < -5)
                english = -1.5F;
            else
                english = 1.0F;
            paddle_x = e.getX() - 30;
        }
    });

    ball = new Ball(20);
}

public void paint(Graphics g)
{
    Graphics2D g2 = (Graphics2D)g;
    g2.setRenderingHint(
        RenderingHints.KEY_ANTIALIASING, 
        RenderingHints.VALUE_ANTIALIAS_ON);

    Shape paddle = new Rectangle2D.Float(
        paddle_x, paddle_y, 60, 8);

    g2.setColor(color[colorIndex % 6]);

    if(ball.intersects(paddle_x, paddle_y, 60, 8)
        && ball.y_speed > 0)
    {
        ball.y_speed = -ball.y_speed;
        ball.x_speed = (int)(ball.x_speed * english);
        if(english != 1.0F)
            colorIndex++;
        score += Math.abs(ball.x_speed * 10);
    }

    if(ball.getY() + ball.getHeight()
        >= LaserBallMain.HEIGHT)
    {
        ball = new Ball(20);
        score -= 1000;
        colorIndex = 0;
    }

    ball.move();
    g2.fill(ball);

    g2.setColor(Color.BLACK);
    g2.fill(paddle);

    g2.drawString("Score: " + score, 250, 20);
}
}

class Ball extends Ellipse2D.Float
{
private static final long serialVersionUID = 1L;

public int x_speed, y_speed;
private int d;
private int width = LaserBallMain.WIDTH;
private int height = LaserBallMain.HEIGHT;

public Ball(int diameter)
{
    super((int)(Math.random() * (LaserBallMain.WIDTH - 20) + 1),
        0, diameter, diameter);
    this.d = diameter;
    this.x_speed = (int)(Math.random() * 5 + 5);
    this.y_speed = (int)(Math.random() * 5 + 5);
}

public void move()
{
    if(super.x < 0 || super.x > width - d)
        x_speed = -x_speed;
    if(super.y < 0 || super.y > height - d)
        y_speed = -y_speed;
    super.x += x_speed;
    super.y += y_speed;     
}
}

Upvotes: 1

Views: 1621

Answers (2)

spgodara
spgodara

Reputation: 1084

LaserBallMain laserBallMain = new LaserBallMain();

JFrame frame = new JFrame();
frame.setLayout(new GridLayout(1, 1));
frame.add(laserBallMain);

// Set frame size and other properties
...

// Call applet methods
laserBallMain.init();
laserBallMain.start();

frame.setVisible(true);

Upvotes: 0

MadProgrammer
MadProgrammer

Reputation: 347184

  • Create a new class called something like Main
  • Create method within Main called public static void main(String args[])
  • Within the main method use EventQueue.invokeLater and pass it a Runnable to execute the initial program logic within the Event Dispatching Thread...

For example...

EventQueue.invokeLater(new Runnable() {
    public void run() {
    }
});
  • Within the run method, create a new instance of a JFrame.
  • Place the logic from the original init method within the run method as well, but instead of adding canvas to the applet, add it to the frame (you created in the previous step).

You will probably need to override getPreferredSize of the PaintSurface class, returning an appropriate size of the game surface.

You should also take a look at Performing Custom Painting and you might find How to use Swing Timers interesting as well.

Personally, I would move the entire program logic to some other class, may be a JPanel for example, then you would only need to add this component to whatever container you wanted

Upvotes: 2

Related Questions