Kamis, 10 November 2011

Konversi Mengubah Program Java Applet Menjadi Java Frame / JFrame

Di bawah ini adalah source code program animasi bola pantul (bouncing ball) menggunakan Java applet. Program bola pantul ini terdiri dari dua class yaitu class Ball dan Bounce. Kemudian di lain waktu kita ingin program bola pantul Java applet ingin kita ubah menjadi program desktop atau program yang tidak menggunakan applet dan web browser. Tapi program Java yang berdiri sendiri tidak memerlukan web browser. Singkat kata, program bola pantul Java applet ingin diubah menggunakan Frame (AWT) atau JFrame (Swing).

Perubahan hanya dilakukan pada class Bounce. Class Ball tidak berubah. Perubahan akan ditandai dengan comment (keterangan).

Class Ball :
import java.awt.*;

class Ball {

public float x, y, dx, dy;
private Color warna;
private int ukuran;

Ball(float x, float y, float dx, float dy, int ukuran, Color warna) {
this.x = x;
this.y = y;
this.dx = dx;
this.dy = dy;
this.warna = warna;
this.ukuran = ukuran;
}

public void pindah(Rectangle kotak) {
// mengubah koordinat bola
x += dx;
y += dy;
//collision detection dg sisi kiri
if (x < kotak.x && dx < 0) { dx = -dx; x -= 2 * (x - kotak.x); } //collision detection dg sisi kanan else if ((x + ukuran) > (kotak.x + kotak.width) && dx > 0) {
dx = -dx;
x -= 2 * ((x + ukuran) - (kotak.x + kotak.width));
}
//collision detection dg sisi atas
if (y < kotak.y && dy < 0) { dy = -dy; y -= 2 * (y - kotak.y); } //collision detection dg sisi bawah else if ((y + ukuran) > (kotak.y + kotak.height) && dy > 0) {
dy = -dy;
y -= 2 * ((y + ukuran) - (kotak.y + kotak.height));
}
}

public void lukis(Graphics g) {
g.setColor(warna);
g.fillOval((int) x, (int) y, ukuran, ukuran);
}
}
Class Bounce :
import java.awt.*;
import java.applet.Applet;

public class Bounce extends Applet implements Runnable {

private Image gambarLayar;
private Graphics layar;
private Thread mesin;
private boolean jalan = false;
private Rectangle kotak;
private Ball bola;
private int lebar, tinggi;

@Override
//otomatis jalan saat applet dimuat ke browser
public void init() {
lebar = size().width; //lebar sesuai lebar applet
tinggi = size().height; //tinggi sesuai tinggi applet
kotak = new Rectangle(lebar, tinggi); //membuat kotak sesuai ukuran applet
bola = new Ball(lebar / 3f, tinggi / 4f, 1.5f, 2.3f, 12, Color.blue); //membuat bola
}

@Override
//otomatis jalan setelah init() selesai
public synchronized void start() {
if (mesin == null || !mesin.isAlive()) {
jalan = true;
mesin = new Thread(this);
mesin.setPriority(Thread.MIN_PRIORITY + 1);
mesin.start();
}
}

//otomatis jalan saat thread dibuat
public void run() {
while (jalan) {
repaint(); //memanggil method update()
try {
mesin.sleep(1000 / 30); //pengatur jeda waktu (mempengaruhi kecepatan bola)
} catch (InterruptedException e) {
//kalau ada error
}
}
}

@Override
// otomatis dijalankan saat tampilan berubah
public void update(Graphics g) {
paint(g);
}

@Override
public void paint(Graphics g) {
if (layar == null) {
gambarLayar = createImage(lebar, tinggi);
layar = gambarLayar.getGraphics();
}
// menggambar background
int x2 = lebar >> 1;
int y2 = tinggi >> 1;
layar.setColor(Color.gray);
layar.fillRect(0, 0, x2, y2);
layar.fillRect(x2, y2, lebar - x2, tinggi - y2);
layar.setColor(Color.white);
layar.fillRect(x2, 0, lebar - x2, tinggi - y2);
layar.fillRect(0, y2, x2, y2);
bola.pindah(kotak);
bola.lukis(layar);
g.drawImage(gambarLayar, 0, 0, null);
}

@Override
public synchronized void stop() {
jalan = false;
}
}
Class Bounce yang diubah menjadi Frame (AWT) (Untuk diubah menjadi JFrame ada beberapa tambahan perintah) :
import java.awt.*;
//import java.applet.Applet;

//public class Bounce extends Applet implements Runnable {
public class Bounce extends Panel implements Runnable {

private Image gambarLayar;
private Graphics layar;
private Thread mesin;
private boolean jalan = false;
private Rectangle kotak;
private Ball bola;
private int lebar, tinggi;
private static int lbr = 500, tng = 500; //tambahan

//@Override
//otomatis jalan saat applet dimuat ke browser
public void init() {
//lebar = size().width; //lebar sesuai lebar applet
lebar = lbr;
//tinggi = size().height; //tinggi sesuai tinggi applet
tinggi = tng;
kotak = new Rectangle(lebar, tinggi); //membuat kotak sesuai ukuran applet
bola = new Ball(lebar / 3f, tinggi / 4f, 1.5f, 2.3f, 12, Color.blue); //membuat bola
//}

//@Override
//otomatis jalan setelah init() selesai
//public synchronized void start() {
if (mesin == null || !mesin.isAlive()) {
jalan = true;
mesin = new Thread(this);
mesin.setPriority(Thread.MIN_PRIORITY + 1);
mesin.start();
}
}

//otomatis jalan saat thread dibuat
public void run() {
while (jalan) {
repaint(); //memanggil method update()
try {
mesin.sleep(1000 / 100); //pengatur jeda waktu (mempengaruhi kecepatan bola)
} catch (InterruptedException e) {
//kalau ada error
}
}
}

@Override
// otomatis dijalankan saat tampilan berubah
public void update(Graphics g) {
paint(g);
}

@Override
public void paint(Graphics g) {
if (layar == null) {
gambarLayar = createImage(lebar, tinggi);
layar = gambarLayar.getGraphics();
}
// menggambar background
int x2 = lebar >> 1;
int y2 = tinggi >> 1;
layar.setColor(Color.gray);
layar.fillRect(0, 0, x2, y2);
layar.fillRect(x2, y2, lebar - x2, tinggi - y2);
layar.setColor(Color.cyan);
layar.fillRect(x2, 0, lebar - x2, tinggi - y2);
layar.fillRect(0, y2, x2, y2);
bola.pindah(kotak);
bola.lukis(layar);
g.drawImage(gambarLayar, 0, 0, null);
}

//@Override
public synchronized void stop() {
jalan = false;
}

public static void main(String[] args) {
Frame f = new Frame();
f.addWindowListener(new java.awt.event.WindowAdapter() {

@Override
public void windowClosing(java.awt.event.WindowEvent e) {
System.exit(0);
}

;
});

Bounce ut = new Bounce();
ut.setSize(lbr, tng); //diubah
f.add(ut);
f.pack();
ut.init();
f.setSize(lbr + 8, tng + 34); //diubah
//f.show();
f.setVisible(true);
}
}

Dari contoh konversi perubahan Java applet menjadi Java non applet (Frame), perubahan yang dilakukan tidak terlalu banyak dan relatif mudah. Namun proses konversi akan menjadi sulit jika program Java applet bergantung pada HTML

Tidak ada komentar: