Skip to main content

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

}

Comments

  1. 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

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

    ReplyDelete
  3. 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?

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

    ReplyDelete
  5. 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?

    ReplyDelete
  6. @ 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.

    ReplyDelete
  7. 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?

    ReplyDelete
  8. @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.

    ReplyDelete
  9. 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?

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

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

    ReplyDelete
  12. 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??

    ReplyDelete
  13. @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

    ReplyDelete
  14. 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...

    ReplyDelete
  15. @Aj

    Perhatikan baris yang ada perintah ini:

    desktop.add(c1);

    nJFrame.buka(c1);

    ,dan

    private frmChild1 c1 = new frmChild1();

    ReplyDelete
  16. 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....

    ReplyDelete

Post a Comment

Popular posts from this blog

Java-MySql: Aplikasi Database dengan Data Gambar (Updated)

Untuk update metode simpan gambar lihat di appGambar 2.0 Bagaimana caranya menyimpan data yang membutuhkan penyimpanan data gambar? Misalkan data pegawai yang membutuhkan penyimpanan gambar dari setiap pegawai. Alternatifnya ada dua, dengan kelebihan dan kekurangan masing-masing. Cara yang pertama adalah dengan membuat field dengan tipe data binary, kemudian menyimpan gambar yang dibutuhkan dalam field di database tersebut. Cara ini membutuhkan manajemen program yang lebih rumit, tapi data gambar akan terjamin, karena tersimpan didalam database yang terintegrasi dengan data lainnya. Kekurangan lainnya adalah ukuran database yang akan membesar dan lambat. Bayangkan saja, sebuah field membutuhkan gambar dengan format jpeg, 200kB. Apabila ada 200 juta record, maka ukuran field yang diperuntukan khusus untuk gambar dengan perhitungan kasar adalah 0.2 MB x 200M = 40 x 10^12 = 40 TB. Belum ditambah dengan ukuran data dari field lainnya, kalau misalkan untuk menyimpan data penduduk Indonesia.

PHP: Kalkulator

Pada intinya, kalkulator berbasis web ini menggunakan tiga dasar, yaitu CSS, PHP, dan HTML. CSS (Cascading Style Sheets) agar mudah mengatur tampilan, PHP (PHP Hypertext Prepocessor) untuk operasi perhitungan, dan HTML (Hypertext Markup Language) untuk pembuatan form kalkulator. Kesemuanya dalam bentuk dasar dengan logika perhitungan sederhana untuk melakukan perhitungan. Sedangkan array diatas digunakan untuk debugger dan memahami jalannya algoritma. <html> <head> </head> <body> <style type="text/css"> .Hasil { color: #fcc; background-color: blue; font-size: 4em; border: 1px solid #660; padding: 4px; } .Operator { color: #fcc; background-color: #900; font-size: 1.5em; border: 1px solid #660; width: 100px; padding: 4px; } .Angka { color: white; background-color: #660; font-size: 1.5em; border: 1px solid #660; padding: 4px; width: 100px; } </style> <?php function Hitung($b1,$b2,$o){ switch($o){ case '+': return $b1

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