Menambahkan Aksi pada Node BeanTreeView Netbeans Platform

Ngelanjutin postingan sebelumnya… agak aneh c yah kalo Node di BeanTreeView tuh gitu2 ajah. Enaknya ada aksinya gitu. Aksi dari Node bisa kamu dapatin dengan meng-override method “getActions” dari kelas “Node”. Dari kelas “Node” lhoh yah. Bukan dari kelas “AbstractNode”. Kalo dari kelas “AbstractNode”, emang ada jugak method yang sama (beda parameter sama tipe balikan tapinya), tapi method ituh udah deprecated kalo gak salah. Untuk method “getActions”, contoh hasilnya bisa kamu lihat di situs tutorial node netpla.

Kalo kamu mau aksi-nya dijalanin pas nge-klik 2x di node-nya, yang perlu kamu override bukan “getActions”, tapi “getgetPreferredAction” dari kelas “AbstractNode”. Gampang kan…

Okeh, best practice-nya gini… Dari project yang kemaren… Kamu punya kan 2 kelas utama. Yang atu berupa top component (Window), tempat ada BeanTreeView, plus satu class lagi yang merupakan class untuk membuat node anak (nama class-nya “SimpulAnak”).

Sekarang, tentuin dulu mau nambahin action di mana. Kalo kamu mau nambahin aksi di “root” (yang dikasi lambang segitiga ke bawah), kamu perlu tambahin method “getPreferredAction” pas deklarasiin Abstract node-nya. Deklarasi abstract node ini ada di bagian konstruktor top component (Window), yang kemaren kita kasi nama “SimpulExplorerTopComponent”:

    public SimpulExplorerTopComponent() {
        initComponents();
        setName(Bundle.CTL_SimpulExplorerTopComponent());
        setToolTipText(Bundle.HINT_SimpulExplorerTopComponent());

        associateLookup(ExplorerUtils.createLookup(mgr, getActionMap()));
        SimpulAnak ecv = new SimpulAnak();
        AbstractNode an = new AbstractNode(Children.create(ecv, true));
        an.setIconBaseWithExtension("/org/seleksi/view/down-rectangle.png");
        mgr.setRootContext(an);        
    }

Kalo mau kasi aksi di node itu, kamu tinggal bikin pendeklarasian objek AbstractNode (yang gw kasi warna biru) jadi gini:

    public SimpulExplorerTopComponent() {
        initComponents();
        setName(Bundle.CTL_SimpulExplorerTopComponent());
        setToolTipText(Bundle.HINT_SimpulExplorerTopComponent());

        associateLookup(ExplorerUtils.createLookup(mgr, getActionMap()));
        SimpulAnak ecv = new SimpulAnak();
        AbstractNode an = new AbstractNode(Children.create(ecv, true)){

        };
        an.setIconBaseWithExtension("/org/seleksi/view/down-rectangle.png");
        mgr.setRootContext(an);   
    }

Jadi jangan langsung ditutup pake titik koma. Tapi dikasi kurung kerawal dulu, baru kasi titik koma. Letakkin kursor kamu di space kosong antara kurung kerawal buka plus tutup, trus tekan “Alt+Insert”. Kamu bakal nemu beberapa menu kayak gini:

1. Override Method

Pilih “Override Method”. Kalo kamu sulit nemuin tombol yang gw maksud di keyboard kamu, bisa pake klik kanan di space kosong tadi, pilih “Insert Code”. Dan kamu mendapatkan hal yang sama kayak nekan “Alt + Insert”

2. Insert Code

Ingat! Posisi kursor sangat menentukan di sini. Kamu pastiin cursornya ada di antara kurung kerawal buka sama kurung kerawal tutup pas ngedeklarasiin objek AbstractNode. Nanti, kamu bakal nemuin semacam window gini:

3. Override Class

Perhatiin, di sana kamu bisa nge-override beberapa method dari beberapa class yang tersedia. Seperti yang gw bilang, method “getPreferredAction” adanya di class “AbstractNode”. Jadi, breakdown (tekan tanda tambahnya). Cari method yang mau di-override, centang method itu. Dan pilih “Generate”.

3. Override Method

Kamu bakal dapatin pendeklarasian jadi gini kamu gini:

    public SimpulExplorerTopComponent() {
        initComponents();
        setName(Bundle.CTL_SimpulExplorerTopComponent());
        setToolTipText(Bundle.HINT_SimpulExplorerTopComponent());

        associateLookup(ExplorerUtils.createLookup(mgr, getActionMap()));
        SimpulAnak ecv = new SimpulAnak();
        AbstractNode an = new AbstractNode(Children.create(ecv, true)){

            @Override
            public Action getPreferredAction() {
                return super.getPreferredAction(); 
                //To change body of generated methods, 
                //choose Tools | Templates.
            }

        };
        an.setIconBaseWithExtension("/org/seleksi/view/down-rectangle.png");
        mgr.setRootContext(an);
        
    }

Okeh, sekarang tinggal kamu ubah ajah isi dari method “getPreferredAction”. Ingat yah, balikannya “Action”, jadi pastiin kamu bikin Action dari method ini. Kalo gw c nambahin inner class yang nge-extends AbstractAction gini:

        AbstractNode an = new AbstractNode(Children.create(ecv, true)){

            @Override
            public Action getPreferredAction() {
                return super.getPreferredAction(); 
                //To change body of generated methods, 
                //choose Tools | Templates.
            }      
            class Aksi extends AbstractAction{
                
            }
        };

Kamu bakal diminta buat nge-implements method abstract yang terkandung di class “AbstractAction”, yaitu method “actionPerformed”. Ubah actionPerformed-nya, dan isi dari method “getPreferredAction” ubah jadi mengembalikan objek dari kelas “Aksi”. Intinya, kamu ubah jadi gini deh:

        AbstractNode an = new AbstractNode(Children.create(ecv, true)){

            @Override
            public Action getPreferredAction() {
                return new Aksi();
            }
            class Aksi extends AbstractAction{

                @Override
                public void actionPerformed(ActionEvent ae) {
                    JOptionPane.showMessageDialog(null, "Hello");
                }    
            }
        };

Nanti hasilnya gini:

4. Hasil Root

Kalo kamu tekan menu 1, menu 2 atau menu 3… itu gak bakal ngaruh apapun. Kamu belum nambahin “getPreferredAction”-nya masalahnya. Dan sekali lagi, method tersebut adanya Cuma di class “AbstractNode”. Sedangkan, yang kamu punya Cuma class ChildFactory sebagai extends dari class “SimpulAnak”. Jadi, bisa dibilang kamu gak bisa nge-override method ini langsung.

Hal ini bisa kamu akalin dengan ngubah struktur codingan program, dengan ngedeklarasiin Node bentukan kamu yang nge-extends “AbstractNode”. Terus, di class Anak (SimpulAnak), di method “createNodeForKey”, isinya kamu ubah dari yang awalnya gini:

BeanNode bn = new BeanNode(key);

Jadi gini:

NodeBentukanSendiri bn = new NodeBentukanSendiri(key);

Tapi… berhubung gw malas nambah 1 class, gw bikinnya gini… yang awalnya isi dari “createNodeForKey” ituh gini:

    @Override
    protected Node createNodeForKey(String key) {
        try {
            BeanNode bn = new BeanNode(key);
            bn.setIconBaseWithExtension
               ("/org/seleksi/view/right-rectangle.png");
            bn.setDisplayName(key);
            System.out.println();
            return bn;
        } catch (IntrospectionException ex) {
            Exceptions.printStackTrace(ex);
            return null;
        }
    }

Gw ubah jadi gini:

    @Override
    protected Node createNodeForKey(String key) {
        try {
            BeanNode bn = new BeanNode(key){

            };
            bn.setIconBaseWithExtension
               ("/org/seleksi/view/right-rectangle.png");
            bn.setDisplayName(key);
            System.out.println();
            return bn;
        } catch (IntrospectionException ex) {
            Exceptions.printStackTrace(ex);
            return null;
        }
    }

Gw tambahin lagi kurung kerawal buka ama kurung kerawal tutup baru dikasi titik koma. Di bagian yang kosong, kamu tekan “Alt+Insert”, terus pilih “Override Method”. Dan… samaan deh kayak sebelumnya. Akhirnya, methodnya berubah jadi gini:

    @Override
    protected Node createNodeForKey(String key) {
        try {
            BeanNode bn = new BeanNode(key) {

                @Override
                public Action getPreferredAction() {
                    return new AksiChild();
                }

                class AksiChild extends AbstractAction {

                    @Override
                    public void actionPerformed(ActionEvent ae) {
                        JOptionPane.showMessageDialog(null, "Child Anak");
                    }

                }
            };
            bn.setIconBaseWithExtension
               ("/org/seleksi/view/right-rectangle.png");
            bn.setDisplayName(key);
            System.out.println();
            return bn;
        } catch (IntrospectionException ex) {
            Exceptions.printStackTrace(ex);
            return null;
        }
    }

Dan hasilnya gini:

5. Hasil Child

Dan perlu diperhaitkan, kalo aksi ini, mau neken node yang manapun, hasilnya pasti sama. Coz semuanya gw bikin seragam. Kalo kamu mau filter, boleh di bagian “actionPerformed”-nya.

Begitulaaaahhh~~~ semoga membantu kamu.

Valid: Yap!
Kadaluarsa: Teruji efektif dari versi 7.4 sampe 8.0
Sumber:
– https://platform.netbeans.org/tutorials/nbm-nodesapi2.html#actions
– http://netbeans-org.1045718.n5.nabble.com/Double-click-a-node-to-open-different-components-td5015328.html

Advertisements

One thought on “Menambahkan Aksi pada Node BeanTreeView Netbeans Platform

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s