Tabbed Container In Stand Alone Swing Application

Buat teman-teman yang sudah tahu teknik ini, mungkin tulisan ini bisa dikatakan ketinggalan jaman :D 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 :D . 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 :D ). 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 :

StandartTabbedPane
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 :

TabbedContainer_Editor
Type Editor
TabbedContainerToolBar
Type ToolBar
TabbedContainerSliding
Type Sliding
TabbedContainerView
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) :

  1. org-netbeans-swing-tabcontrol.jar
  2. org-openide-awt.jar
  3. org-openide-util-lookup.jar
  4. org-openide-util.jar
  5. 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 :

TampilanPallete
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 :

  1. TabDataModel dan
  2. DefaultTabDataModel

Karena saya bingung bagaimana cara menggunakan TabDataModel, maka pada tulisan ini kita akan menggunakan DefaultTabDataModel saja ya :D

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 :

CustomizeCode
Tampilan Customize Code

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
Sukses Menjalankan TabbedContainer

Hore sudah jadi :) Tapi eits… tunggu dulu ini belum selesai :D 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 :
TampilanLAFKacau
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 :D

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 :

  1. TabbedContainer API
  2. TabData API
  3. TabDataModel API
  4. DefaultTabDataModel API
  5. Package org.netbeans.swing.plaf Description
  6. NetBeans Architecture Answers for Look & Feel Customization Library module
  7. TabContainer better JTabbedPane (JavaLobby Forum)
  8. Menambahkan Komponen Ke NetBeans Pallete
  9. Cara Checkout Contoh Aplikasi Martin Personal Project
  10. Source Code TabbedContainer Project
  11. Project TabbedContainer.zip

Tags: , , , ,

18 Responses to “Tabbed Container In Stand Alone Swing Application”

  1. @Newuser:

    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 :)

    Betul, karena TabbedContainer ini kan dia milik NetBeans Platform yang kita pakai di stand alone om :)

    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 :)

    Ane setuju klo yang ini :D TabbedContainer ini emang bukan turunan dari JTabbedPane om, jd apa yang “biasa” kita pakai di TabbedContainer ini sudah jelas tidak sama ama JTabbedPane :) (Btw sudah dijelaskan di API-nya juga)

    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

    Klo untuk urusan LAF + Skin saya rasa semua aplikasi berbasis Swing semua sama ya om :D Cuma yang sedikit membedakan antara TabbedContainer kalau dibandingin dengan komponen sejenis “yang lain” yaitu Untuk “menggambar” semua komponen dengan LAF, NB punya mekanisme sendiri yang harus dijalankan agar LAF berjalan dengan mulus. Nah ini yang berbeda dengan aplikasi stand alone biasa yang bisa kita “install” LAF/Skin baru :D Karena saya juga baru “ngoprek”, belum bisa komentar :D Cuma kesan pertama saya waktu konfigurasi LAF lumayan “susah” juga sih :D

    Tapi yang saya seneng dari manajemen LAF di NB ini yaitu, untuk SystemLookAndFeel tampilannya keliatan berbeda (lebih mulus keliatan-nya) dengan aplikasi swing stand alone yang sama-sama menggunakan SystemLAF buatan saya :D

    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.

    +1 salaman

    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 :D
    CMIIW

    Hm.. perasaan dulu yang ngajarin saya swing siapa ya di forum DW ??? (sembari lirik-lirik orang jkt yang kul di jogja) hmm2

    Peace om swt2

  2. @Newuser: Owh pengguna JIDE toh :D :) mantap2x om, sharing dong om +/- ma JIDE ?? :)

    • newuser says:

      hmm sharing yg bagaimana ya? :D
      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 :D
      CMIIW

  3. newuser says:

    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 :)

  4. @Newuser: Wah om sorry baru sempat bales om, abis diskusi internal barusan tadi jd ga ngecek email :D 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 :D Cuma blm begitu detail komponen mana aja yg “komersial” tersebut :D Btw om udah pernah ngoprek lebih dalam tentang JIDE ???

  5. newuser says:

    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.

  6. newuser says:

    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

Leave a Reply

[+] adsenseid emoticons by Martinus Ady H. Modified from nartzco source code.