29 July 2008

Membuat Multiple Document Interface (MDI) Window



MDI Window? Sebuah Jendela yang bisa menamping beberapa dialog didalamnya yang berdiri sendiri. Cara pembuatannya, supaya tidak tergantung dengan jenis editor yang digunakan, kita pahami dulu langkah pembuatannya. Langkah ini juga bisa untuk memahami sedikit konsep tentang OOP. Sedangkan editornya bisa apa aja. Yang jelas, source code yang disediakan dibawah bisa dijalankan meskipun diedit dengan Notepad. Sedangkan editor lainnya, bisa dicoba sehingga mempunyai pemahaman dan cara masing-masing. Karena langkah ini cuma salah satunya yang agak sederhana.
- Buat sebuah Form Utama untuk tempat semua form lainnya, kita namakan parent window
- Tambahkan JDesktopPane untuk tempat tampilan semua child window nantinya.
- Pada parent window, tambahkan tombol atau menu untuk memanggil form child window
- Buat sebuah kelas untuk menyimpan semua prilaku object child window supaya seragam, sehingga semua child window merupakan inheritance dari class dasar ini. Kita namakan namakan nJFrame yang merupakan inheritance dari JInternalFrame. Pada kelas ini juga ada method buka untuk menampilkan dan menghilangkan child window.
- Sekarang buat child window dengan jenis JInternalFrame, yang diganti menjadi inheritance nJFrame yang kita buat.
- pada parent window, add semua child window kedalam desktopPane dengan method add pada saat inisialisasi.
- Gunakan method buka dari nJFrame pada setiap tombol di parent window yang berfungsi menampilkan child window masing-masing.





Source Code untuk Masing-masing class:



//frmMenu.java
public class frmMenu extends javax.swing.JFrame {
public frmMenu() {
initComponents();
desktop.add(c2);
desktop.add(c1);

setExtendedState(java.awt.Frame.MAXIMIZED_BOTH);
}
private void initComponents() {//GEN-BEGIN:initComponents
jToolBar1 = new javax.swing.JToolBar();
jButton1 = new javax.swing.JButton();
jButton2 = new javax.swing.JButton();
desktop = new javax.swing.JDesktopPane();


addWindowListener(new java.awt.event.WindowAdapter() {
public void windowClosing(java.awt.event.WindowEvent evt) {
exitForm(evt);
}
});

jButton1.setText("Child1");
jButton1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jButton1ActionPerformed(evt);
}
});

jToolBar1.add(jButton1);

jButton2.setText("Child2");
jButton2.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jButton2ActionPerformed(evt);
}
});

jToolBar1.add(jButton2);

getContentPane().add(jToolBar1, java.awt.BorderLayout.NORTH);

getContentPane().add(desktop, java.awt.BorderLayout.CENTER);

java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
setBounds((screenSize.width-400)/2, (screenSize.height-300)/2, 400, 300);
}//GEN-END:initComponents

private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton2ActionPerformed
nJFrame.buka(c2);
}//GEN-LAST:event_jButton2ActionPerformed

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton1ActionPerformed
nJFrame.buka(c1);
}//GEN-LAST:event_jButton1ActionPerformed

/** Exit the Application */
private void exitForm(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_exitForm
System.exit(0);
}//GEN-LAST:event_exitForm

public static void main(String args[]) {
new frmMenu().show();
}

// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JDesktopPane desktop;
private javax.swing.JButton jButton1;
private javax.swing.JButton jButton2;
private javax.swing.JToolBar jToolBar1;
// End of variables declaration//GEN-END:variables
private frmChild1 c1 = new frmChild1();
private frmChild1 c2 = new frmChild1();
}



//nJFrame.java
public class nJFrame extends javax.swing.JInternalFrame {
public nJFrame() {
super( "" , //title
false, //resizable
true, //closable
false, //maximizable
false);//iconifiable

}
public static void buka(javax.swing.JInternalFrame frame){
if(frame.isVisible()){
frame.setVisible(false);
}else{
frame.setVisible(true);
try {
frame.setSelected(true);
} catch (java.beans.PropertyVetoException e) {}
}

}
}


//frmChild1.java
public class frmChild1 extends nJFrame {
public frmChild1() {
initComponents();
}
private void initComponents() {//GEN-BEGIN:initComponents

setBounds(0, 0, 352, 276);
}//GEN-END:initComponents


// Variables declaration - do not modify//GEN-BEGIN:variables
// End of variables declaration//GEN-END:variables

}


//frmChild2.java
public class frmChild2 extends nJFrame {
public frmChild2() {
initComponents();
}
private void initComponents() {//GEN-BEGIN:initComponents

setTitle("Window");
setBounds(0, 0, 416, 302);
}//GEN-END:initComponents


// Variables declaration - do not modify//GEN-BEGIN:variables
// End of variables declaration//GEN-END:variables

}

17 °C:

Belajar PHP said...

bgus bgt bos, btw gimana kbr? ga pernah ketemu
pengen konsul ni...,setiawan(IM/PI/2006-2008)
konsul ttg java, aq pengen bongkar n compile ulang sesuai kinginan qt, gtu kpn ada waktu? bls d emailq ya..: setiam3@gmail.com

om4gus said...

@Belajar PHP
Kan disana masih banyak orang yang pintar dan peduli. Kok masih saya juga yang dikejar?

newbie said...

Mas, misalkan ada 2 form A dan B. Di dalam form A ada button untuk memanggil dan menampilkan form B. Gmn caranya ya mas untuk manggil form B itu? Karna saya coba dengan cara biasa yaitu:

b = new FormB();
this.add(b);
b.show();

form B bisa muncul tetapi seperti tumpang tindih dengan form A. Jadi form B seperti transparan gitu. Ketika mouse saya gerakan, button2 dan field2 di form A muncul. Gmn ya caranya mas agar 2form bisa dibuka secara bersamaan?

om4gus said...

@newbie
Coba hilangkan perintah this add. Jadi cuma perlu dua baris perintah.

Anonymous said...

Mas, saya mau tanya kalau menggunakan setVisible itu memberatkan atau ga sih? Karna klo setVisible(false), itu bukannya hanya meng-hide form tapi tidak di destroy seperti dispose()? Jd, kalau ada connect ke db, walaupun form di-false kan visible-nya, dia akan tetap connect?

om4gus said...

@ Anonim
Connect ke db tidak ada hubungannya dengan manajemen form, tapi dengan aplikasi.
Koneksi bisa ditutup dengan cara diclose connection atau dengan exit application, jadi meskipun form pemanggilnya sudah didispose kalau aplikasi belum di exit, koneksi masih tetap berjalan.
Sedangkan alokasi memori untuk form sendiri akan hilang apabila di dispose.
Sedangkan keuntungan dari penggunaan setvisible adalah lebih cepat saat akan dipanggil kembali.

orang_bingung said...

Mas, saya numpang tanya ya. kalau misalkan di form transaksi saya itu ada combobox (berisi nama mahasiswa) yg isinya diambil dari database. lalu di form master mahasiswa, ada penambahan data mahasiswa baru. Jadi kondisinya, form transaksi telah saya buka lalu saya tutup (kn pake setVisible(false)). Lalu saya buka form master untuk menambahkan data baru, kemudian membuka form transaksi lagi (yg menggunakan setVisible(true)). Nah, combobox yang ada di form transaksi itu jd tidak ke-refresh karna saya mengisi combobox hanya pertama x pada saat form di-construct. Jd bgmn cara mengatasi masalah itu ya mas?
Tadinya saya sudah coba melakukan pengisian combobox ketika user menekan tombol "Add" (jd di remove all items dulu combobox-nya, baru kemudian diisi kembali). Tp kenapa jd aneh ya mas? Kadang tombol Add-nya harus diklik 2x dulu baru mau, atau combobox-nya terkadang tidak terisi. Saya ngmg terkadang karna tidak selalu ngaco seperti itu. Knp bisa begitu ya mas?

om4gus said...

@orang_bingung
Pengisian cbbox dilakukan saat form create. Set visible false seharusnya tidak menghilangkan isi data cbbox.
Sedangkan mengenai penekanan tombol add, penyebabnya adalah begini, pengambilan data dari database membutuhkan waktu yang lama secara signifikan. Jadi kadang data yang diambil bisa keluar saat event yang diinginkan tapi kadang terlalu lama sehingga perintah lain dilaksanakan. Managemen code yang bagus harusnya bisa mengatasi masalah ini.

orang_bingung said...

Memang tidak menghilangkan isi combobox mas. tp yg saya maksud itu, combobox itu tidak akan merefresh ketika ada data baru yg masuk, karna pengisian combobox dilakukan ketika form di-create aja. Jd, klo saya isi data baru di form master, lalu saya buka lg form transaksi, data yg baru tidak ada di dalam combobox. Jadi kira2 lebi baik seperti saat apa ya mas isi combobox-nya?

TOPI HITAM said...

Wah Om 4gus keren2 tutorialnya saya modif yoh mas, bisa request gak mas tutorial buat aplikasi kayak macam aplikasi warnet sederhana...

om4gus said...

@ topi hitam
Gk ada rencana untuk buat warnet. Lihat nanti aja yah

Aj said...

Itu turtorialnya jalanin dari menu item kan ya mas..
kenapa pas saya jalanin dari button ga mw ya mas....
itu yang form barunya internalFrame kan ya??
InternalFrame if = new InternalFrame();
if.show();
atau
menu.getMenu().mdi(InternalFrame.getIf());

kalau dari button gmana ya mas ada cara lain kah??

om4gus said...

@aj
Kode yg disini sudah dicoba?
Semua pakai button, tidak ada Menu.

private void jButton1ActionPerformed
(java.awt.event.ActionEvent evt) {//GEN-
FIRST:event_jButton1ActionPerformed
nJFrame.buka(c1);
}//GEN-LAST:event_
jButton1ActionPerformed

Aj said...

ehehhee...ga merhatiin naronya diatas saya pikir kya menuItem....desktop.add(c1); error ya mas pnya saya...

saya buat login dulu sebelumnya baru masuk kya frame diatas jd error null pointer ya mas...

om4gus said...

@Aj

Perhatikan baris yang ada perintah ini:

desktop.add(c1);

nJFrame.buka(c1);

,dan

private frmChild1 c1 = new frmChild1();

Aj said...

iya cm pas desktop.add(c1);
error null pointer pas login saya jd null pointer kalo ada syntax desktop.add(c1);

mw tnya mas...itu internalframe bisa gak di set 1 aja yang keluar...jd kalo sebelum di close internalframe sebelumnya ga bsa di buka lg...setVisible saya ga bisa....

om4gus said...

@Aj
Bisa :)

Post a Comment