Tabbed Container In Stand Alone Swing Application
Buat teman-teman yang sudah tahu teknik ini, mungkin tulisan ini bisa dikatakan ketinggalan jaman
Sebenarnya apa sih maksud tulisan ini ? Tulisan ini cuma ingin menunjukkan pada teman-teman yang belum tahu bagaimana sih menggunakan Tabbed Pane milik NetBeans (TabbedContainer) pada Aplikasi Swing kita
Kenapa saya bilang tulisan ini ketinggalan jaman ? Karena ternyata, sudah ada yang pernah melakukan hal serupa sejak tahun 2004 lalu
( NetBeans versi 4.0, detail artikel bisa dibaca disini ). Kenapa saya posting lagi disini, karena cari tutorialnya ternyata susah juga
. Jadi harapan saya agar, semoga teman-teman yang belum tahu bisa dengan mudah mencoba dan tidak perlu berlama-lama bermain dengan paman Google
Ok sudah siap?? Kalau iya, mari kita lanjutkan
Seperti teman-teman ketahui bersama, class JTabbedPane pada Swing mempunyai sedikit sekali fitur dan juga JTabbedPane hanya mempunyai 2 buah mode tampilan yaitu SCROLL_TAB_LAYOUT dan WRAP_TAB_LAYOUT yang bisa kita konfigurasi melalui metode setTabLayoutPolicy() (WRAP_TAB_LAYOUT merupakan konfigurasi standart dari JTabbedPane jadi tidak perlu dikonfigurasi lagi agar tampilan tab menjadi mode “wrapping”) Nah sekarang yang menjadi pertanyaan saya yaitu, apakah teman-teman pernah membuat sebuah aplikasi yang mempunyai jumlah tab yang banyak (anggap saja sampai 10 atau 20 tab lebih) dalam 1 form ? Bagaimanakah tampilan tab teman-teman ? Kemudian bagaimana navigasi antar tab ? Dengan menggunakan JTabedPane yang hanya membawa 2 buah mode tampilan akan terasa sangat kurang dan proses navigasi menjadi “susah”. Jika menggunakan tampilan WRAP_TAB_LAYOUT navigasi antar tab memang mudah, tapi dari tampilan akan terlihat sedikit “kurang pas dimata”. Sedangkan jika kita menggunakan tampilan SCROLL_TAB_LAYOUT, dari sisi tampilan bagus (tidak berubah) tapi dari sisi navigasi terasa sangat susah
(Bayangkan jika kita ingin pindah secara cepat dari tab 20 ke tab 1, dengan menggunakan tampilan SCROLL_TAB_LAYOUT kita harus melakukan klik 1-1 dari tab 20 sampai tab 1 tampil. Hm.. bukan proses yang menyenangkan saya rasa
). Untuk menjelaskan ilustrasi saya diatas, mari kita sama-sama melihat screenshot tampilan JTabbedPane dalam 2 mode yaitu SCROLL_TAB_LAYOUT dan WRAP_TAB_LAYOUT dibawah ini :

Tampilan WRAP_TAB_LAYOUT (atas) dan SCROLL_TAB_LAYOUT (bawah)
Nah setelah melihat tampilan standart dari JTabbedPane diatas, sekarang mari kita bandingkan apa yang ditawarkan oleh TabbedContainer atau NetBeans TabbedPane
Untuk masalah tampilan TabbedContainer membawa lebih banyak mode (tipe) yaitu TabbedContainer.TYPE_EDITOR, TabbedContainer.TYPE_TOOLBAR, TabbedContainer.TYPE_SLIDING dan TabbedContainer.TYPE_VIEW yang bisa kita lihat pada gambar dibawah ini :
![]() Type Editor |
![]() Type ToolBar |
![]() Type Sliding |
![]() Type View |
Waaw… lebih mantap bukan ? Selain dengan tampilan lebih banyak kita juga dapat bonus yaitu adanya tombol “close” yang secara otomatis terdapat pada setiap panel yang kita tambahkan ke dalam TabbedContainer
Ok-ok cukup sudah preview-nya
Sekarang bagaimana agar aplikasi Swing kita bisa mempunyai tab seperti diatas ? Caranya sangat mudah yaitu, silahkan ambil library-library dibawah ini pada direktori $NETBEANS_HOME/platform/modules (dimana $NETBEANS_HOME adalah tempat dimana NetBeans di install) :
- org-netbeans-swing-tabcontrol.jar
- org-openide-awt.jar
- org-openide-util-lookup.jar
- org-openide-util.jar
- org-openide-windows.jar
Setelah mengamankan ke 5 library diatas, sekarang buatlah sebuah project baru dengan nama TabbedContainer kemudian tambahkan library tersebut. Setelah menambahkan ke 5 library diatas pada project yang telah kita buat, sekarang tambahkanlah komponen TabbedContainer yang terdapat pada library org-netbeans-swing-tabcontrol.jar ke NetBeans Pallete dengan mengikuti tulisan Menambahkan Komponen Ke NetBeans Pallete hingga tampilan NetBeans Pallete kita menjadi seperti gambar dibawah ini :

Tampilan Komponen TabbedContainer Pada NetBeans Pallete
Jika sudah, sekarang buatlah 1 buah JFrame dan pasanglah komponen TabbedContainer yang baru ditambahkan tersebut ke dalam JFrame. Nah yang perlu diperhatikan disini adalah TabbedContainer ini menggunakan konsep DataModel seperti JTable dengan TableModelnya, jadi sebelum menampilkan tab kita harus mengkonfigurasi dahulu DataModel untuk TabbedContainer ini. Sedangkan model yang terdapat pada TabbedContainer ini ada 2 yaitu :
- TabDataModel dan
- DefaultTabDataModel
Karena saya bingung bagaimana cara menggunakan TabDataModel, maka pada tulisan ini kita akan menggunakan DefaultTabDataModel saja ya
Nah didalam DataModel (DefaultTabDataModel atau TabDataModel) ini, kita bisa menambahkan sebuah TabData yang dapat kita isi dengan komponen yang akan ditampilkan pada tab melalui constructor TabData(Object userObject, Icon i, String caption, String tooltip). Setelah TabData terisi dengan komponen yang ingin kita tampilkan, maka kita dapat menambahkan-nya kedalam DefaultTabDataModel melalui method addTab(int index, TabData tabData) seperti contoh dibawah ini :
DefaultTabDataModel tabDataModel = new DefaultTabDataModel(); tabDataModel.addTab(0, new TabData(new MyPanel(), null, "First Tab", "First Tab"));
Proses inisialisasi model telah selesai sampai disini dan siap untuk digunakan, sekarang mari kita tambahkan model yang sudah berisi TabData beserta komponen kita kedalam TabbedContainer sekalian menentukan mode yang akan digunakan dengan cara seperti dibawah ini :
....
TabbedContainer tabbedContainer1 = new TabbedContainer(tabDataModel, TabbedContainer.TYPE_EDITOR);
....Diatas kita sudah mengetahui bagaimana cara menggunakan DefaultTabDataModel, TabData dan memasangnya kedalam TabbedContainer, sekarang bagaimana implementasi-nya pada project yang telah dibuat sebelumnya ? Sama seperti pada langkah yang sudah dijelaskan diatas, sekarang buatlah sebuah variabel global untuk DefaultTabDataModel dan inisialisasi-lah pada constructor JFrame tepat diatas method initComponent() dan tambahkanlah sebuah TabData seperti dibawah ini :
1 2 3 4 5 6 7 8 9 10 11 12 13 | public class TabbedContainerFrame extends javax.swing.JFrame { private DefaultTabDataModel tabDataModel; /** Creates new form TabbedContainerFrame */ public TabbedContainerFrame() { tabDataModel = new DefaultTabDataModel(); tabDataModel.addTab(0, new TabData(new MyPanel(), null, "First Tab", "First Tab")); initComponents(); setLocationRelativeTo(null); } } |
Jika sudah sekarang masuk-lah pada mode design kemudian klik kanan pada komponen TabbedContainer dan pilih Customize Code dan edit constructor TabbedContainer seperti gambar dibawah ini :
Sekarang coba jalankanlah project-nya dengan menekan tombol F6 dan jika tidak ada error yang terjadi maka seharusnya kita akan melihat tampilan seperti gambar dibawah ini :

Sukses Menjalankan TabbedContainer
Hore sudah jadi
Tapi eits… tunggu dulu ini belum selesai
Sekarang bagaimana jika kita ingin menggunakan System Look And Feel dan tampilan-nya akan sebagus NetBeans ? Ok sekarang mari kita coba tambahkan kode untuk memasang System Look And Feel pada method Main hingga menjadi seperti dibawah ini :
public static void main(String[] args) { java.awt.EventQueue.invokeLater(new Runnable() { public void run() { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (ClassNotFoundException ex) { Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); } catch (InstantiationException ex) { Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); } catch (IllegalAccessException ex) { Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); } catch (UnsupportedLookAndFeelException ex) { Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); } new TabbedContainerFrame().setVisible(true); } }); }
Dan hasilnya adalah seperti gambar dibawah ini :

Tampilan Look And Feel Yang Kacau
Tampilan TabbedContainer jadi kacau seperti ini terjadi ketika menggunakan Look And Feel GTK dan Nimbus, sedangkan pada Windows Look And Feel tampilan tidak mengalami perubahan yang signifikan alias baik-baik saja !!
Berdasarkan JavaDoc LookAndFeel NetBeans, seluruh proses “rendering” pada NetBeans dan NetBeans Platform terdapat pada package org.netbeans.swing.plaf. Dan jika ingin tampilan yang sesuai dengan Look And Feel yang berjalan, kita harus memanggil method org.netbeans.swing.plaf.Startup.run() pada saat startup. Sekarang carilah library org-netbeans-swing-plaf.jar pada direktori $NETBEANS_HOME/platform/modules dan tambahkanlah pada project, setelah itu sekarang modifikasilah method Main menjadi seperti dibawah ini :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | public static void main(String[] args) { java.awt.EventQueue.invokeLater(new Runnable() { public void run() { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (ClassNotFoundException ex) { Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); } catch (InstantiationException ex) { Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); } catch (IllegalAccessException ex) { Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); } catch (UnsupportedLookAndFeelException ex) { Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); } Startup.run(null, 1, null); new TabbedContainerFrame().setVisible(true); } }); } |
Dan sekarang coba jalankan lagi projectnya dengan menekan tombol F6 dan bagaimana hasilnya ???
Penambahan kode pada baris 16 diatas jangan dilakukan jika menggunakan Windows LookAndFeel, penggunaan 1 baris kode diatas pada Windows Look And Feel akan menyebabkan tampilan tabcontrol menjadi kacau !!!
Fyuh.. akhirnya selesai juga tulisan-nya
dan semoga bisa membantu teman-teman yang masih merasa penasaran bagaimana menggunakan TabbedContainer ini pada aplikasi Swingnya !! Sekedar catatan saja, penggunaan Startup.run() masih belum dicoba di Nimbus LAF hasilnya memuaskan atau tidak. Dan untuk penggunaan beda OS mungkin bisa di bedakan jika LookAndFeel yang dipakai adalah GTK maka panggil method Startup.run(), jika tidak maka abaikan
Semua bahan-bahan yang saya jadikan sebagai referensi dan hasil percobaan bisa teman-teman lihat pada link-link dibawah dan akhir kata selamat ber-eksperimen teman-teman dan mohon maaf klo ada yang salah dengan pembahasan-nya (jika ada salah, mari direvisi bersama-sama)
Happy Hacking Guys !!
Link-link terkait :
- TabbedContainer API
- TabData API
- TabDataModel API
- DefaultTabDataModel API
- Package org.netbeans.swing.plaf Description
- NetBeans Architecture Answers for Look & Feel Customization Library module
- TabContainer better JTabbedPane (JavaLobby Forum)
- Menambahkan Komponen Ke NetBeans Pallete
- Cara Checkout Contoh Aplikasi Martin Personal Project
- Source Code TabbedContainer Project
- Project TabbedContainer.zip
Tags: Java, java swing, NetBeans, project, TabbedContainer







@Newuser:
@Newuser: Owh pengguna JIDE toh
mantap2x om, sharing dong om +/- ma JIDE ??
hmm sharing yg bagaimana ya?
Karena ini bahas tab di swing, perbandingan singkatnya begini antara jide tab dan TabbedContainer:
1. TabbedContainer memerlukan beberapa jar, jide tab hanya menggunakan 1 jar, bonusnya di dalamnya sudah ada component2 yang lain. Score 1 utk jide dan 0 untuk TabbedContainer dalam keringkasan management file
2. TabbedContainer mempunyai 4 style tab yaitu Type Editor, Type ToolBar, Type Sliding, Type View. Sedangkan jide meski hanya mempunyai 1 style tapi shapes di JideTabbedPane banyak sekali variannya seperti SHAPE_WINDOWS, SHAPE_VSNET, SHAPE_BOX, SHAPE_OFFICE2003, SHAPE_FLAT, SHAPE_ECLIPSE, SHAPE_ECLIPSE3x, SHAPE_EXCEL, SHAPE_ROUNDED_VSNET, SHAPE_ROUNDED_FLAT, SHAPE_WINDOWS_SELECTED. Ini lebih dipermudah dengan adanya 4 jenis behaviour dari JideTabbedPane yaitu RESIZE_MODE_NONE, RESIZE_MODE_FIT, RESIZE_MODE_FIXED, RESIZE_MODE_COMPRESSED. Kalo diliat dari fungsi..well..tab adalah tab yang perlu diganti stylenya itu kan shapes nya sekali lagi menurut saya JideTabbedPane udah bener arahnya so…masih menurut pendapat pribadi, di area ini +1 untuk JideTabbedPane dan masih 0 untuk TabbedContainer. Score 2-0
3. Untuk pengaturan tampilan, jide lebih flexible dan cross platform ketimbang TabbedContainer. Jide menggunakan skin yang bisa diinstall disemua look and feel yg kita gunakan, plus skin jide dah include juga di jar nya jide oss. Tampilannya mengacu pada office2003 dan office2007. Ga bisa kita pungkiri, microsoft masih kiblatnya soal User Interface, tapi kita masih bisa pake L&F susbtance dengan skin dari jide
+1 lagi untuk JideTabbedPane, TabbedContainer masih 0. Score 3-0
4. JideTabbedPane di inherit directly dari JTabbedPane, jadi semua fungsi tetap sama dengan bila kita menggunakan JTabbedPane biasa, bandingkan dengan TabbedContainer yang masih inherit dari JComponent, menurut saya, kita ga butuh component baru, hanya penambahan fitur di JTabbedPane. +1 untuk jide, masih 0 untuk TabbedContainer. Score 4-0.
Masih banyak area yg mesti dibahas, tapi biar om martin aja yg explore lebih jauh, sekali lagi semua point di atas hanya pendapat pribadi saya sebegai programmer swing amatiran
CMIIW
saya memang menggunakan jide oss om untuk project2 swing
jide Tab termasuk di dalam jide oss.
untuk table masih pake JXTable dari swingx.
padahal ngiler sama jide grid dan jide data grid (beta). Tapi bayar euy $299 per component
@Newuser: Wah om sorry baru sempat bales om, abis diskusi internal barusan tadi jd ga ngecek email
Untuk TabbedContainer ini saya blm explore lebih jauh lagi sih om, nanti klo saya udah explore pasti saya share juga koq
Btw yg untuk JIDE, iya emang itu komponen bagus juga dan opensource. Cuma setahu saya terakhir ngecek, ada beberapa komponen yang masih komersial om
Cuma blm begitu detail komponen mana aja yg “komersial” tersebut
Btw om udah pernah ngoprek lebih dalam tentang JIDE ???
saya lagi nih om hehehe
coba om bandingkan dengan Jide Tab:
http://www.jidesoft.com/products/oss.htm
lebih mudah penggunaannya, dengan fitur yang sama dan yg pasti open source juga.
lapor om, dah bisa singleton nya, tapi curhat nih om, saya merasa sulit untuk melakukan deteksi event2 di Tabbed Container itu. Mungkin ada tutorial lanjutan dari tutorial ini mengenai pembahasan event-event di Tabbed Container. Thanks b4