Semua aplikasi yang ada saat ini dapat membuka lebih dari satu jendela kerja (multiple window). Kemampuan membuka lebih dari satu jendela dikenal dengan MDI (Multiple Document Interface). Kebalikan dari MDI adalah SDI (Single Document Interface). Multiple document interface memang populer dan digunakan di banyak aplikasi windows. Di Java, Anda dapat membuat aplikasi semacam ini. Java menyediakan kelas untuk maksud tersebut yaitu kelas JDesktopPane dan kelas JInternalFrame.
Kelas JDesktopPane.
JDesktopPane adalah kelas wadah (container class) untuk membuat MDI. Dalam membuat MDI, Anda tetap menggunakan kelas JFrame atau JApplet sebagai jendela luar (outer window), kemudian menambahkan obyek kelas JDesktopPane ke content pane kelas JFrame atau JApplet dan kemudian menambahkan obyek kelas JInternalFrame ke obyek JDesktopPane. JDesktopPane sendiri tidak mendukung border dan selalu diletakkan area tengah content pane kelas JFrame atau JApplet. Kelas JDesktopPane mempunyai sebuah konstruktor untuk mengkonstruksi obyek desktop pane.
// Mengkonstruksi obyek desktop pane
JDesktopPane()
Kelas JInternalFrame.
Kelas JInternalFrame adalah turunan kelas JComponent. JInternalFrame digunakan untuk membuat jendela (window) di dalam jendela yang lain. JInternalFrame mempunyai banyak fitur sebagaimana frame pada aplikasi window saat ini seperti dragging, closing, resizing, menjadi icon, menampilkan title dan mendukung menu bar.
Anda dapat menggunakan kelas JInternalFrame dengan cara yang hampir sama dengan kelas JFrame. Misalnya saja, menambahkan komponen di conten pane dari kelas JInternalFrame dapat menggunakan metoda add, sedangkan menentukan ukuran frame dari obyek internal frame dapat menggunakan metoda setSize.
Kelas JFrame bertindak sebagai komponen window level atas, sedangkan kelas JInternalFrame harus ditambahkan obyek kelas JDesktopPane yang ada di kelas JFrame atau JApplet. Anda dapat menampilkan obyek internal frame yang ada di obyek JDesktopPane menggunakan metoda setVisible.
Berikut ini adalah daftar konstruktor kelas JInternalFrame untuk mengkonstruksi obyek internal frame:
Konstruktor Kelas JInternalFrame
| Konstruktor | Keterangan |
|---|---|
| JInternalFrame() | Mengkonstruksi obyek internal frame yang menonaktifkan resizable, maximisable, iconifiable dari frame tanpa adanya title. |
| JInternalFrame(String title) | Mengkonstruksi obyek internal frame yang menonaktifkan resizable, maximisable, iconifiable dari frame dengan title tertentu. |
| JInternalFrame(String title, boolean resizable) | Mengkonstruksi obyek internal frame yang mengaktifkan resizable dan menonaktifkan maximisable, iconifiable dari frame dengan title tertentu. |
| JInternalFrame(String title, boolean resizable, boolean closable) | Mengkonstruksi obyek internal frame yang mengaktifkan resizable dan closable serta menonaktifkan maximisable, iconifiable dari frame dengan title tertentu. |
| JInternalFrame(String title, boolean resizable, boolean closable, boolean maximisable) | Mengkonstruksi obyek internal frame yang mengaktifkan resizable, closable dan maximisable serta menonaktifkan iconifiable dari frame dengan title tertentu. |
| JInternalFrame(String title, boolean resizable, boolean closable, boolean maximisable, boolean iconifiable) | Mengkonstruksi obyek internal frame dengan mengaktifkan resizable, closable, maximisable dan iconifiable dari frame dengan title tertentu. |
Contoh program di bawah ini menggunakan kelas JDesktopPane dan JInternalFrame untuk membuat program aplikasi MDI. Sebagaimana telah dijelaskan di atas, Anda tetap menggunakan kelas JFrame atau JApplet sebagai komponen jendela level atas (top level window component). Berikut ini adalah kode program dan hasil kompilasinya:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 | // Nama file : AplikasiMDI.java // Menggunakan kelas JDesktopPane dan JInternalFrame // Mengimpor kelas import java.awt.*; import java.awt.event.*; import javax.swing.*; // Deklarasi kelas public class AplikasiMDI extends JFrame { private JMenuBar mnuBar; private JMenu mnuForm; private JMenuItem mnuItemFlow, mnuItemGrid, mnuItemBorder; private JDesktopPane desktopPane; private JInternalFrame intFrameFlow, intFrameGrid, intFrameBorder; private JPanel panelFlow, panelGrid, panelBorder; // Kontruktor tanpa argumen public AplikasiMDI() { // Membuat menu mnuBar = new JMenuBar(); mnuForm = new JMenu("Form"); mnuItemFlow = new JMenuItem("Form With FlowLayout"); mnuItemGrid = new JMenuItem("Form With GridLayout"); mnuItemBorder = new JMenuItem("Form With BorderLayout"); mnuForm.add(mnuItemFlow); mnuForm.add(mnuItemGrid); mnuForm.add(mnuItemBorder); mnuBar.add(mnuForm); setJMenuBar(mnuBar); // menambahkan desktopPane ke content pane kelas JFrame desktopPane = new JDesktopPane(); // Membuat internal frame pertama intFrameFlow = new JInternalFrame("FlowLayout", true, true, true, true); panelFlow = new JPanel(); panelFlow.setLayout(new FlowLayout(FlowLayout.LEFT, 3, 3)); for (int xFlow = 0; xFlow < 5; xFlow++) panelFlow.add(new JButton("Tombol" + (xFlow + 1))); intFrameFlow.getContentPane().add(panelFlow); intFrameFlow.setSize(250, 150); intFrameFlow.setDefaultCloseOperation(HIDE_ON_CLOSE); // Membuat internal frame kedua intFrameGrid = new JInternalFrame("GridLayout", true, true, true, true); panelGrid = new JPanel(); panelGrid.setLayout(new GridLayout(3, 2, 3, 3)); for (int xGrid = 0; xGrid < 5; xGrid++) panelGrid.add(new JButton("Tombol" + (xGrid + 1))); intFrameGrid.getContentPane().add(panelGrid); intFrameGrid.setSize(250, 150); intFrameGrid.setDefaultCloseOperation(HIDE_ON_CLOSE); // Membuat internal frame ketiga intFrameBorder = new JInternalFrame("BoderLayout", true, true, true, true); panelBorder = new JPanel(); panelBorder.setLayout(new BorderLayout(3, 3)); panelBorder.add((new JButton("Tombol1")), BorderLayout.LINE_START); panelBorder.add((new JButton("Tombol2")), BorderLayout.LINE_END); panelBorder.add((new JButton("Tombol3")), BorderLayout.PAGE_START); panelBorder.add((new JButton("Tombol4")), BorderLayout.PAGE_END); panelBorder.add((new JButton("Tombol5")), BorderLayout.CENTER); intFrameBorder.getContentPane().add(panelBorder); intFrameBorder.setSize(270, 150); intFrameBorder.setDefaultCloseOperation(HIDE_ON_CLOSE); desktopPane.add(intFrameFlow); desktopPane.add(intFrameGrid); desktopPane.add(intFrameBorder); getContentPane().add(desktopPane, BorderLayout.CENTER); mnuItemFlow.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent ae) { intFrameFlow.setLocation(10, 10); intFrameFlow.setVisible(true); } } ); mnuItemGrid.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent ae) { intFrameGrid.setLocation(40, 34); intFrameGrid.setVisible(true); } } ); mnuItemBorder.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent ae) { intFrameBorder.setLocation(70, 58); intFrameBorder.setVisible(true); } } ); } // Akhir blok konstruktor // Metoda main public static void main(String[] args) { AplikasiMDI frame = new AplikasiMDI(); frame.setTitle("Kelas AplikasiMDI"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(400, 270); frame.setVisible(true); } } |
Contoh program di atas memungkinkan Anda untuk membuka tiga obyek internal frame dari kelas JInternalFrame sekaligus menggunakan item menu yang tersedia. Masing-masing internal frame berisi lima tombol yang diletakkan terlebih dahulu di obyek panel (kelas JPanel) dengan tata letak (layout) berbeda. Untuk menampilkan internal frame, Anda menggunakan metoda setVisible.
Ada beberapa aturan dalam menggunakan JInternalFrame. Anda harus mengatur ukuran (size) dari internal frame serta lokasi dimana internal frame akan ditampilkan. Agar internal frame dapat dibuka, ditutup dan dibuka kembali, Anda perlu memberi argumen metoda setDefaultCloseOperation dengan HIDE_ON_CLOSE.