26 August 2008

Data Encription Standard & MD5 di Java

DES ya?
Tidak seperti halnya MD5, DES(Data Encryption Standard) menggunakan sebuah file key untuk melakukan enkripsi dan dekripsi. Jadi, hasil enkripsi dari sebuah kalimat akan berbeda sesuai dengan key yang digunakan. Dan untuk bisa melakukan dekrip, harus menggunakan key sesuai dengan pembuatnya. Key persis berperan sebagai kunci pembuka. Untuk teorinya, silakan tanyakan ke dosen masing-masing aja. Sedangkan contoh ini merupakan penerapan DES, yang sekaligus merupakan enkripsi dari md5. class DES akan membuat key terlebih dahulu apabila belum ada. Key ini yang akan selalu digunakan untuk melakukan enkripsi. Dekripsi tidak bisa dilakukan apabila key ini hilang, karena pembuatan key baru pasti akan menghasilkan key yang berbeda dengan sebelumnya.
Pada contoh gambar, Input yang pertama merupakan Kalimat yang kemudian dienkrip. Sedangkan pada input kedua mencoba melakukan dekrip dari hasil pertama. Melakukan dekrip pada kata yang bukan merupakan hasil enkrip DES akan menyebabkan IllegalFormatException seperti saat pertama. Selain itu, ada proses enkripsi didahului MD5 kemudian baru DES.
Sebenarnya, penggunaan MD5 dan DES sendiri berbeda. MD5 digunakan khusus untuk mendapat hash dari kalimat atau file, dan tidak diperlukan proses dekripsi. Untuk mendapatkan kebenaran dari nilai MD5, dilakukan dengan membandingkan nilai tersebut dengan hasil enkrip MD5 kata itu lagi, bukan dengan proses dekripsi. Kita tidak bisa mendapatkan nilai awal dari sebuah hasil enkripsi MD5. Sedangkan DES sendiri memungkinkan untuk melakukan enkripsi sekaligus dekripsi untuk mengembalikan nilai awal, dengan key yang tepat tentunya. Meskipun untuk saat ini sudah tidak diterapkan secara profesional karena kelemahan algoritma ini yang bisa dipecahkan dengan cara brute force, tapi, sudah lumayan, bisa buat mainan surat rahasia.
Untuk class MD5 berasal dari posting sebelumnya.
Mmmmmm, jadi pengin membahas DSA, Digital Signature Algorithm nih, lengkap dengan PKI-nya. Jauh lebih menarik! Eh iya, ngga ada download source kali ini, kayaknya bisa langsung jadi deh.

import java.io.*;
import java.security.*;
import javax.crypto.*;
import sun.misc.*;

class AeSimpleMD5 {
private static String convertToHex(byte[] data) {
StringBuffer buf = new StringBuffer();
for (int i = 0; i < data.length; i++) {
int halfbyte = (data[i] >>> 4) & 0x0F;
int two_halfs = 0;
do {
if ((0 <= halfbyte) && (halfbyte <= 9)) {
buf.append((char) ('0' + halfbyte));
} else {
buf.append((char) ('a' + (halfbyte - 10)));
}
halfbyte = data[i] & 0x0F;
} while (two_halfs++ < 1);
}
return buf.toString();
}

public static String MD5(String text)
throws NoSuchAlgorithmException, UnsupportedEncodingException {
MessageDigest md;
md = MessageDigest.getInstance("MD5");
byte[] md5hash = new byte[32];
md.update(text.getBytes("iso-8859-1"), 0, text.length());
md5hash = md.digest();
return convertToHex(md5hash);
}
}

class DES {
String R = "";
public static String encrypt(String text) {
return process("e", text);
}
public static String decrypt(String text) {
return process("d", text);
}
public static String process(String mode, String text) {
// Get or create key.
Key key;
try {
try {
ObjectInputStream in = new ObjectInputStream(
new FileInputStream("SecretKey.ser"));
key = (Key) in.readObject();
in.close();
} catch (FileNotFoundException fnfe) {
KeyGenerator generator = KeyGenerator.getInstance("DES");
generator.init(new SecureRandom());
key = generator.generateKey();
ObjectOutputStream out = new ObjectOutputStream(
new FileOutputStream("SecretKey.ser"));
out.writeObject(key);
out.close();
}

// Get a cipher object.
Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");

// Encrypt or decrypt the input string.
if (mode.indexOf("e") != -1) {
cipher.init(Cipher.ENCRYPT_MODE, key);
String amalgam = text;

byte[] stringBytes = amalgam.getBytes("UTF8");
byte[] raw = cipher.doFinal(stringBytes);
BASE64Encoder encoder = new BASE64Encoder();

String base64 = encoder.encode(raw);
//System.out.println(base64);
return base64;
} else if (mode.indexOf("d") != -1) {
cipher.init(Cipher.DECRYPT_MODE, key);
BASE64Decoder decoder = new BASE64Decoder();
byte[] raw = decoder.decodeBuffer(text);
byte[] stringBytes = cipher.doFinal(raw);
String result = new String(stringBytes, "UTF8");
//System.out.println(result);
return result;
}
} catch (Exception e) {
//System.out.println("DES Error:" + e);
}
return "Error!";
}
}

class Main {
public static void main(String[] args) throws IOException {
BufferedReader userInput = new BufferedReader(new InputStreamReader(System.in));
System.out.print("Input string: ");
String rawString = userInput.readLine();
try {
System.out.println("Hasil MD5 : '" + AeSimpleMD5.MD5(rawString) + "'");
System.out.println("Hasil Encript DES : '" + DES.encrypt(rawString) + "'");
System.out.println("Hasil Decrypt DES : '" + DES.decrypt(rawString) + "'");
System.out.println("Hasil Encript MD5 -> DES : '" + DES.encrypt(AeSimpleMD5.MD5(rawString)) + "'");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
}


Selamat...... hari selasa.
N3XT...arrow

25 August 2008

Pembuatan PDF di PHP dengan FPDF dan HTML2FPDF

Untuk membuat pdf dengan menggunakan php, kita bisa menggunakan fpdf yang berbasis class. Sedangkan html2fpdf digunakan untuk mengubah html menjadi pdf. Dengan hanya menggunakan fpdf, kita harus menentukan semua hal yang mengatur tampilannya berbasis code sesuai dengan aturan dan fungsi yang disediakan class tersebut. Dengan menggunakan html2fpdf, kita cuma perlu membuat sebuah file html dan tampilannya langsung diubah menjadi sebuah file pdf, tentu dengan beberapa keterbatasan dan perubahan tampilan. Saat ini, fpdf terbaru pada versi 1.6 sedangkan html2fpdf versi 3.

Instalasi:
+ Ekstrak file fpdf dan html2fpdf. Sebenarnya html2fpdf merupakan inheritance dari class fpdf, tapi class di fpdf yang disdertakan di paket html2fpdf telah dimodifikasi dari aslinya sesuai dengan kebutuhan konversi tersebut. Class original dari fpdf akan kita pakai untuk pembuatan pdf secara manual, bukan dari html.
+ Ganti nama file fpdf.php misalkan menjadi fpdf16.php. Karena untuk bebrapa versi instalasi php terbaru sudah menyertakan fpdf secara default sebagai salah satu plugin. Misalkan, paket xampp meletakannya di w:\xampplite\php\pear\fpdf.php. Apabila tidak diganti namanya, pada saat proses include atau require, yang terpanggil adalah fpdf.php dari sistem php. Penggunaan fpdf yang biasanya tidak sesuai dengan versi yang kita inginkan akan selalu menyebabkan kesalahan. Beberapa perbaikan tersebut adalah: perbaikan alamat include, error loading css dan gambar, gif parser error, penambahan spasi yang tidak perlu yang menyebabkan error Header.
+ Lakukan modifikasi pada beberapa file php, karena kita sudah melakukan penggantian nama. Selain itu entah kenapa masih ada beberapa bug didalamnya yang harus diperbaiki secara manual. Sebenarnya bisa dengan melakukan pelacakan sendiri pada saat terjadi kesalahan. Sebenarnya pengin dijelasin satu persatu, tapi daripada rumit, silakan download saja arsip fpdf dan html2fpdf yang sudah dimodifikasi dan diberi beberapa perbaikan dibagian bawah, kemudian lakukan ekstraksi. Sehingga susunannya menjadi seperti contoh sebagai berikut:

W:\xampplite\htdocs\
pdf\
pdf\fpdf16\
fpdf16.php
pdf\fpdf16\doc\
pdf\fpdf16\font\
pdf\fpdf16\font\makefont\
pdf\fpdf16\tutorial\
pdf\try\
index1.php
index3.php
test1.html
index4.php
index5.php
index2.php
pdf\html2fpdf\
htmltoolkit.php
source2doc.php
html2fpdf.php
no_img.gif
fpdf16.php
gif.php
pdf\html2fpdf\font\
pdf\html2fpdf\font\makefont\

Sekarang kita mulai contohnya :
1. Hello World!, tentunya contoh paling sederhana.
2. Menggunakan class fpdf. Manual yang disertakan sudah lengkap, jadi bisa dipelajari sendiri. Pada versi 1.6 sudah mendukung penggunaan gif sebagai gambar. Setiap teks dan gambar yang akan kita masukkan dalam file pdf berasal dari barisan kode dengan parameter letak koordinat, ukuran, tampilan, beserta teks atau gambar tersebut. Pada contoh ini juga ada pengambilan file text untuk menjadi pdf. (TXT2PDF)
3. Mengambil dan melakukan konversi file html menjadi pdf. (HTML2PDF).
4. Mengambil dan mengubah file php. Tentu harus berasal dari server yang sama karena menggunakan perintah include untuk pengambilannya. (PHP2PDF).
5. Mengambil dan mengubah sebuah lokasi web (URL2PDF). Menggunakan CURL untuk mengambil content web, tapi ternyata hasilnya berantakan. Hal yang sama terjadi pada saat dicoba menggunakan get_content(). Penyebabnya sih karena pada contoh ini memanggil cms phpnuke yang entah kenapa tidak bisa mengambil css eksternal yang didefinisikan sehingga semuanya menjadi tidak beraturan tanpa aturan css. Ada yang punya saran?

1. Hello World!

2. TXT2PDF

3. HTML yang diubah

3. HTML2PDF

4. PHP yang diubah

4. PHP2PDF

5. URL yang diubah

5. URL2PDF

////////////////////index1.php//////////////////////
<?php
require('../fpdf16/fpdf16.php');

$pdf=new FPDF();
$pdf->AddPage();
$pdf->SetFont('Arial','B',16);
$pdf->Cell(40,10,'Hello World!');
$pdf->Output('doc.pdf','I');
?>


///////////////////index2.php//////////////////////


<?php
require('../fpdf16/fpdf16.php');

class PDF extends FPDF
{
function Header()
{
global $title;

//Arial bold 15
$this->SetFont('Arial','B',15);
//Calculate width of title and position
$w=$this->GetStringWidth($title)+6;
$this->SetX((210-$w)/2);
//Colors of frame, background and text
$this->SetDrawColor(0,80,180);
$this->SetFillColor(230,230,0);
$this->SetTextColor(220,50,50);
//Thickness of frame (1 mm)
$this->SetLineWidth(1);
//Title
$this->Cell($w,9,$title,1,1,'C',true);
//Line break
$this->Ln(10);
}

function Footer()
{
//Position at 1.5 cm from bottom
$this->SetY(-15);
//Arial italic 8
$this->SetFont('Arial','I',8);
//Text color in gray
$this->SetTextColor(128);
//Page number
$this->Cell(0,10,'Page '.$this->PageNo(),0,0,'C');
}

function ChapterTitle($num,$label)
{
//Arial 12
$this->SetFont('Arial','',12);
//Background color
$this->SetFillColor(200,220,255);
//Title
$this->Cell(0,6,"Chapter $num : $label",0,1,'L',true);
//Line break
$this->Ln(4);
}

function ChapterBody($file)
{
//Read text file
$f=fopen($file,'r');
$txt=fread($f,filesize($file));
fclose($f);
//Times 12
$this->SetFont('Times','',12);
//Output justified text
$this->MultiCell(0,5,$txt);
//Line break
$this->Ln();
//Mention in italics
$this->SetFont('','I');
$this->Cell(0,5,'(end of excerpt)');
}

function PrintChapter($num,$title,$file)
{
$this->AddPage();
$this->ChapterTitle($num,$title);
$this->ChapterBody($file);
}
}

$pdf=new PDF();
$title='20000 Leagues Under the Seas';
$pdf->SetTitle($title);
$pdf->SetAuthor('Jules Verne');
$pdf->PrintChapter(1,'A RUNAWAY REEF','text.txt');
$pdf->Output('doc.pdf','I');
?>


///////////////////////index3.php////////////////////////


<?
require("../html2fpdf/html2fpdf.php");
$htmlFile = "test1.html";
$file = fopen($htmlFile,"r");
$size_of_file = filesize($htmlFile);
$buffer = fread($file, $size_of_file);
fclose($file);

$pdf=new HTML2FPDF();
$pdf->AddPage();
$pdf->WriteHTML($buffer);
$pdf->Output('doc.pdf','I');
?>

//////////////////////index4.php/////////////////////////


<?php
ob_start();
include "../../Files/index.php";
$htmlbuffer=ob_get_contents();
ob_end_clean();
require('../html2fpdf/html2fpdf.php');
$pdf=new HTML2FPDF();
$pdf->AddPage();
$pdf->WriteHTML($htmlbuffer);
$pdf->Output('doc.pdf','I');
?>

////////////////////index5.php//////////////////////////

<?php
function load($url){
if (!$curld = curl_init()) {
echo "CURL GAGAL.\n";
exit;
}

curl_setopt($curld, CURLOPT_URL, $url);
curl_setopt($curld, CURLOPT_RETURNTRANSFER, true);
$output = curl_exec($curld);
curl_close($curld);
return $output;

}
ob_start();

echo load("http://localhost/nuker/");
$htmlbuffer=ob_get_contents();
ob_end_clean();
require('../html2fpdf/html2fpdf.php');
$pdf=new HTML2FPDF();
$pdf->AddPage();
$pdf->WriteHTML($htmlbuffer);
$pdf->Output('doc.pdf','I');
?>

Download:

fpdf v1.6
html2fpdf-3.0.2b
fpdf dan html2fpdf, dengan modifikasi perbaikan dan contohnya.
N3XT...arrow

06 August 2008

Java: Pengiriman Parameter antar Frame

Sebenarnya konsep ini berlaku bukan hanya pada frame, tapi bisa dilakukan antar object dari class yang sifatnya umum, karena Java yang sifatnya sudah full OOP. Tapi, karena lebih sering diterapkan dalam pemrograman GUI desktop, khususnya dengan Netbeans, maka dicontohkan dengan class javax.swing.JFrame.
Setiap bentuk code java harus dibentuk dalam bentuk class, biar sebagaimanapun sederhananya. Tidak seperti pemrograman lainnya yang menggunakan konsep OOP sebagai tambahan dan pengembangan dari yang sudah ada sebelumnya. Itulah sebabnya kita mengenal class di C++, Pascal, PHP, tapi masih diperbolehkan untuk tetap menggunakan konsep primitif. Sedangkan pada kasus java dan .NET, OOP merupakan inti utamanya yang harus selalu diikuti dan diterapkan. Awalnya akan sangat membingungkan, tapi sangat mudah untuk langkah pengembangan selanjutnya. Sudah lihat JavaDoc? itu adalah dokumen pemrograman yang paling aneh didunia, pada pandangan pertama. Coba bandingkan dengan MSDN-nya .NET, PHP Manual, atau Delphi Help, JavaDoc cuma serangkaian kamus aneh hampir tanpa contoh penggunaannya. Tapi itulah asiknya OOP, dengan serangkaian aturan yang serupa, yang bisa diterapkan untuk class apa saja, kita bisa membuat apapun yang bisa dibuat dengan java cuma mengandalkan kamus aneh ini.
Class sendiri merupakan serangkaian aturan dan definisi dari program yang akan dibuat. Class harus dibuat menjadi object untuk bisa memanfaatkan program yang ada didalamnya. Keharusan ini membuat perintah 'new', sebuah keyword untuk membuat object dari class, sangat sering ditemui. Pada saat pembuatan object, selain membuat object dengan nama yang ditentukan atau bisa juga cuma sebuah object anonim, juga melaksanakan perintah yang ada dalam constructor. Constructor adalah fungsi khusus dengan nama sama dengan nama class yang dibuat, dengan tipe akses public tanpa penentuan tipe data. Apabila tidak ada constructor, tidak ada proses yang dijalankan bersamaan dengan pembuatan object, dan itu diperbolehkan. Sedangkan pembuatan constructor lebih dari satu untuk tujuan yang berbeda juga diperbolehkan. Dengan sarat, memakai jumlah dan atau tipe data parameter yang berbeda.

public class namaClass{
public namaClass(){
}
public namaClass(String params){
}
public namaClass(int params){
}
}


Sedangkan untuk pengiriman data antar frame, kita menggunakan parameter yang kita sebutkan di constructor ini. Dengan beberapa contoh penggunaannya. Yang jelas, kita harus membuat constructor dengan parameter yang disesuaikan. Constructor hanya dijalankan pada saat pertama kali pembuatan object. Tapi contoh dibawah ini, selain contoh pertama, isi data parameter akan berubah, jadi tidak bersifat statis pada saat runtime.

1. frameOne memanggil sambil mengirimkan parameter string ke frameTwo.

Yang harus dilakukan adalah menyediakan constructor String di frameTwo, selanjutnya menampilkan data yang diterima. Dalam hal ini dalam bentuk JLabel.

public frameTwo(String parameter){
initComponents();
jLabel1.setText(parameter);
}

Sedangkan pada frameOne sebagai pembanggil, membuat object dari class dengan constructor frameTwo yang sudah dibuat, mengisi parameter dari constructor sesuai dengan string yang dikirimkan, kemudian menampilkan object frameTwo. Gunakan jButton1 untuk tempat perintah tersebut.

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
frameTwo obj2=new frameTwo("DATA");
obj2.setVisible(true);
}

2. frameOne memanggil sambil mengirimkan parameter berupa object JtextField ke frameThree. Isinya diambil oleh frameThree.

Ini artinya, Secara runtime, JtextField bisa dimanipulasi bukan hanya dari frameOne sebagai pemilik, tapi juga frameThree. Isi dari JTextField bisa langsung diambil apabila ada perubahan saat runtime melalui tombol JButton. Tapi, frameOne sebagai pemilik JTextField harus diinisialisasi terlebih dahulu, apabila belum, akan terjadi NullPointerException.

Kita harus membuat constructor di frameThree dengan parameter JTextField, Membuat variabel global untuk tempat parameter yang diterima, membuat jLabel1 dan tombol jButton1 untuk mengupdate isinya.

public frameThree(JTextField parameter){
initComponents();
this.parameter = parameter;
jLabel1.setText(this.parameter.getText());
}
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
jLabel1.setText(parameter.getText());
}
JTextField parameter;

Pada frameOne, kita memanggil constructor dari frameThree dengan parameternya dan menampilkan frame tersebut. Buat jTextField1 untuk dilewatkan sebagai parameter dan jButton2 untuk pemanggilan.

Sekarang coba lakukan perubahan pada JtextField di frameOne, maka Isi dari JLabel di frameThree akan berubah setelah tombol dibawahnya diklik, sesuai isi yang terbaru dari JTextField di frameOne.

private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {
frameThree obj3=new frameThree(jTextField1);
obj3.setVisible(true);
}

3. merupakan kebalikannya dari yang kedua. frameOne memanggil sambil mengirimkan parameter berupa object JLabel ke frameThree. Isi dari JLabel nantinya bisa ditentukan dari frameFour.

Buat constructor pada frameFour dengan parameter JLabel. Buat jTextField1 dan jButton1 untuk mempengaruhi isi dari label di frameOne.

public frameFour(JLabel parameter) {
initComponents();
this.parameter=parameter;
this.parameter.setText(jTextField1.getText());
}
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
parameter.setText(jTextField1.getText());
}
public JLabel parameter;


Di frameOne, panggil frameFour dengan melewatkan parameter jLabel1.

Sekarang, panggil frameFour dengan tombol di frameOne, setelah frameFour tampil, lakukan perubahan isi jTextField1, tekan tombolnya, maka isi jLabel1 di frameOne akan berubah.

private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {
frameFour obj4=new frameFour(jLabel1);
obj4.setVisible(true);
}

Selain itu, buat DefaultCloseOperation dari semua frame selain frame utama menjadi dispose.

Selesai. Sekarang, selali lagi, penerapannya bisa dalam banyak hal. Misalkan dengan mengirimkan parameter berupa JButton sehingga event yang dilakukan bisa dijalankan di frame yang lain. Atau banyak hal lainnya yang melibatkan banyak class dan object secara simultan.

Source Code:

/////////////////////////////////////////////////////////////////

/* frameOne.java */

public class frameOne extends javax.swing.JFrame {

public frameOne() {

initComponents();

}

private void initComponents() {


jButton1 = new javax.swing.JButton();

jButton2 = new javax.swing.JButton();

jTextField1 = new javax.swing.JTextField();

jButton3 = new javax.swing.JButton();

jLabel1 = new javax.swing.JLabel();


setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

setTitle("frameOne");


jButton1.setText("panggil FrameTwo dengan mengirim parameter String \"DATA\"");

jButton1.addActionListener(new java.awt.event.ActionListener() {

public void actionPerformed(java.awt.event.ActionEvent evt) {

jButton1ActionPerformed(evt);

}

});


jButton2.setText("panggil frameThree dengan mengirim parameter JTextField1");

jButton2.addActionListener(new java.awt.event.ActionListener() {

public void actionPerformed(java.awt.event.ActionEvent evt) {

jButton2ActionPerformed(evt);

}

});


jTextField1.setText("jTextField1");


jButton3.setText("panggil frameFour");

jButton3.addActionListener(new java.awt.event.ActionListener() {

public void actionPerformed(java.awt.event.ActionEvent evt) {

jButton3ActionPerformed(evt);

}

});


jLabel1.setBackground(new java.awt.Color(204, 255, 255));

jLabel1.setText("jLabel1");

jLabel1.setOpaque(true);


javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());

getContentPane().setLayout(layout);

layout.setHorizontalGroup(

layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(layout.createSequentialGroup()

.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(layout.createSequentialGroup()

.addGap(122, 122, 122)

.addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, 167, javax.swing.GroupLayout.PREFERRED_SIZE))

.addGroup(layout.createSequentialGroup()

.addGap(27, 27, 27)

.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)

.addComponent(jButton1)

.addComponent(jButton2)))

.addGroup(layout.createSequentialGroup()

.addGap(120, 120, 120)

.addComponent(jButton3, javax.swing.GroupLayout.PREFERRED_SIZE, 152, javax.swing.GroupLayout.PREFERRED_SIZE))

.addGroup(layout.createSequentialGroup()

.addGap(94, 94, 94)

.addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 212, javax.swing.GroupLayout.PREFERRED_SIZE)))

.addContainerGap(36, Short.MAX_VALUE))

);

layout.setVerticalGroup(

layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(layout.createSequentialGroup()

.addGap(52, 52, 52)

.addComponent(jButton1)

.addGap(31, 31, 31)

.addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)

.addGap(18, 18, 18)

.addComponent(jButton2)

.addGap(38, 38, 38)

.addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 21, javax.swing.GroupLayout.PREFERRED_SIZE)

.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)

.addComponent(jButton3)

.addContainerGap(31, Short.MAX_VALUE))

);


pack();

}// </editor-fold>


private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {

frameTwo obj2=new frameTwo("DATA");

obj2.setVisible(true);

}


private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {

frameThree obj3=new frameThree(jTextField1);

obj3.setVisible(true);

}


private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {

frameFour obj4=new frameFour(jLabel1);

obj4.setVisible(true);

}



public static void main(String args[]) {

java.awt.EventQueue.invokeLater(new Runnable() {

public void run() {

new frameOne().setVisible(true);

}

});

}

// Variables declaration - do not modify

private javax.swing.JButton jButton1;

private javax.swing.JButton jButton2;

private javax.swing.JButton jButton3;

private javax.swing.JLabel jLabel1;

private javax.swing.JTextField jTextField1;

// End of variables declaration



}


/////////////////////////////////////////////////////////////////////////////////////

/* frameTwo.java */


public class frameTwo extends javax.swing.JFrame {

public frameTwo() {

initComponents();

}

public frameTwo(String parameter){

initComponents();

jLabel1.setText(parameter);

}

// <editor-fold defaultstate="collapsed" desc="Generated Code">

private void initComponents() {


jLabel1 = new javax.swing.JLabel();


setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);

setTitle("frameTwo");


jLabel1.setBackground(new java.awt.Color(204, 255, 255));

jLabel1.setText("jLabel1");

jLabel1.setOpaque(true);


javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());

getContentPane().setLayout(layout);

layout.setHorizontalGroup(

layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(layout.createSequentialGroup()

.addGap(72, 72, 72)

.addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 239, javax.swing.GroupLayout.PREFERRED_SIZE)

.addContainerGap(72, Short.MAX_VALUE))

);

layout.setVerticalGroup(

layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(layout.createSequentialGroup()

.addGap(37, 37, 37)

.addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 31, javax.swing.GroupLayout.PREFERRED_SIZE)

.addContainerGap(65, Short.MAX_VALUE))

);


pack();

}// </editor-fold>



public static void main(String args[]) {

java.awt.EventQueue.invokeLater(new Runnable() {

public void run() {

new frameTwo().setVisible(true);

}

});

}

// Variables declaration - do not modify

private javax.swing.JLabel jLabel1;

// End of variables declaration



}


/////////////////////////////////////////////////////////////////////////////////////

/* frameThree.java */


import javax.swing.*;

public class frameThree extends javax.swing.JFrame {

public frameThree() {

initComponents();

}

public frameThree(JTextField parameter){

initComponents();

this.parameter = parameter;

jLabel1.setText(this.parameter.getText());

}

// <editor-fold defaultstate="collapsed" desc="Generated Code">

private void initComponents() {


jLabel1 = new javax.swing.JLabel();

jButton1 = new javax.swing.JButton();


setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);

setTitle("frameThree");


jLabel1.setBackground(new java.awt.Color(204, 255, 255));

jLabel1.setText("jLabel1");

jLabel1.setOpaque(true);


jButton1.setText("update jLabel1");

jButton1.addActionListener(new java.awt.event.ActionListener() {

public void actionPerformed(java.awt.event.ActionEvent evt) {

jButton1ActionPerformed(evt);

}

});


javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());

getContentPane().setLayout(layout);

layout.setHorizontalGroup(

layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(layout.createSequentialGroup()

.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(layout.createSequentialGroup()

.addGap(99, 99, 99)

.addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 142, javax.swing.GroupLayout.PREFERRED_SIZE))

.addGroup(layout.createSequentialGroup()

.addGap(75, 75, 75)

.addComponent(jButton1, javax.swing.GroupLayout.PREFERRED_SIZE, 186, javax.swing.GroupLayout.PREFERRED_SIZE)))

.addContainerGap(48, Short.MAX_VALUE))

);

layout.setVerticalGroup(

layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(layout.createSequentialGroup()

.addGap(33, 33, 33)

.addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 27, javax.swing.GroupLayout.PREFERRED_SIZE)

.addGap(18, 18, 18)

.addComponent(jButton1, javax.swing.GroupLayout.PREFERRED_SIZE, 37, javax.swing.GroupLayout.PREFERRED_SIZE)

.addContainerGap(38, Short.MAX_VALUE))

);


pack();

}// </editor-fold>


private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {

jLabel1.setText(parameter.getText());

}

public static void main(String args[]) {

java.awt.EventQueue.invokeLater(new Runnable() {

public void run() {

new frameThree().setVisible(true);

}

});

}

JTextField parameter;

// Variables declaration - do not modify

private javax.swing.JButton jButton1;

private javax.swing.JLabel jLabel1;

// End of variables declaration

}


/////////////////////////////////////////////////////////////////////////////////////

/* frameFour.java */


import javax.swing.*;

public class frameFour extends javax.swing.JFrame {

public frameFour() {

initComponents();

}

public frameFour(JLabel parameter) {

initComponents();

this.parameter=parameter;

}

// <editor-fold defaultstate="collapsed" desc="Generated Code">

private void initComponents() {


jButton1 = new javax.swing.JButton();

jTextField1 = new javax.swing.JTextField();


setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);

setTitle("frameFour");


jButton1.setText("ubah JLabel di frameOne");

jButton1.addActionListener(new java.awt.event.ActionListener() {

public void actionPerformed(java.awt.event.ActionEvent evt) {

jButton1ActionPerformed(evt);

}

});


jTextField1.setText("jTextField1");


javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());

getContentPane().setLayout(layout);

layout.setHorizontalGroup(

layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(layout.createSequentialGroup()

.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(layout.createSequentialGroup()

.addGap(75, 75, 75)

.addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, 151, javax.swing.GroupLayout.PREFERRED_SIZE))

.addGroup(layout.createSequentialGroup()

.addGap(25, 25, 25)

.addComponent(jButton1, javax.swing.GroupLayout.PREFERRED_SIZE, 231, javax.swing.GroupLayout.PREFERRED_SIZE)))

.addContainerGap(62, Short.MAX_VALUE))

);

layout.setVerticalGroup(

layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()

.addContainerGap(43, Short.MAX_VALUE)

.addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)

.addGap(32, 32, 32)

.addComponent(jButton1)

.addGap(42, 42, 42))

);


pack();

}// </editor-fold>


private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {

parameter.setText(jTextField1.getText());

}

public static void main(String args[]) {

java.awt.EventQueue.invokeLater(new Runnable() {

public void run() {

new frameFour().setVisible(true);

}

});

}

public JLabel parameter;

// Variables declaration - do not modify

private javax.swing.JButton jButton1;

private javax.swing.JTextField jTextField1;

// End of variables declaration

}

/////////////////////////////////////////////////////////////////////////////////////

Berantakan ya? masih nyoba2 pake scribefire soalnya.....
N3XT...arrow