Tutorial : Autocomplete dengan SwingX JXComboBox

Kali ini saya akan membahas bagaimana cara membuat Autocomplete yang sederhana menggunakan JXCombobox yang ada di SwingX. Untuk yang belum pernah tau apa itu autocomplete, mari bahas autocomplete ini bersama-sama. Autocomplete merupakan komponen yang akan otomatis mencari data yang kita ketikan pada suatu combobox maupun texfield, pencairan ini dapat biasanya dilakukan dengan mencari data yang sama persis maupun data yang hampir mirip. Jika kalian masih bingung dengan penjelasan diatas ada baiknya kalian menyimak gambar berikut dibawah ini. Saya sediakan dua gambar mengenai autocomplete ini yang satu sebelum kita menuliskan sesuatu dan disebelah kanannya setelahnya.



Untuk dapat membuat component seperti diatas setidaknya kalian membutuhkan file jar SwingX, selain itu untuk tutorial kali ini saya menggunakan library atau jar file form layout (cara penggunaannya akan dibahas ditutorial saya selanjutnya). Untuk download jar Form Layout kalian bisa mendapatkannya di website JGoodies. Tanpa lama lagi silahkan kalian lihat dan pelajari source code dibawah ini.

package org.motekar.latihan.others;

import com.jgoodies.forms.builder.DefaultFormBuilder;
import com.jgoodies.forms.layout.CellConstraints;
import com.jgoodies.forms.layout.FormLayout;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.util.ArrayList;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import org.jdesktop.swingx.JXComboBox;
import org.jdesktop.swingx.autocomplete.AutoCompleteDecorator;
import org.jdesktop.swingx.autocomplete.ObjectToStringConverter;
import org.jdesktop.swingx.combobox.ListComboBoxModel;

/**
 *
 * @author Muhamad Wibawa
 */
public class AutoCompleteExamples extends JFrame {

    private JXComboBox comboStudent = new JXComboBox();
    private JXComboBox comboStudent2 = new JXComboBox();
    private static String[] peopleName = new String[]{"Adam Barclay",
        "Aleksandras Novikovas", "Bill Snyder", "Bryan Young",
        "Dan Leuck", "Daniel Lewis", "Daniel Olivera",
        "David Bolsover", "David Hall", "Diego Gil",
        "Dirk Hillbrecht", "Doug Berkland",
        "Erik Vickroy", "Fred Lavigne",
        "Gilles Philippart", "Haris Peco",
        "Jan Bosenberg", "James Morgan",
        "Jeanette Winzenburg", "Mario Cesar",
        "Mark Davidson", "Mark Fortner", "Mark Thornton",
        "Matt Nathan", "Michael Bush", "Michael Swindle",
        "Neil Weber", "Nicola Ken Barozzi", "Noel Grandin",
        "Oleg Minukhin", "Patrick Gotthardt", "Patrick Wright",
        "Pierre Le Lannic", "Ray Turnbull", "Ricardo Lopes",
        "Richard Bair", "Richard Osbaldeston", "Robert Eden", "Robert Stone",
        "Ronald Tetsuo Miura", "Salvan Haas", "Scott Delap",
        "Sean McNamara", "Simon Morris", "Shai Almog",
        "Thomas Bierhance", "Wade Chandler", "Waldemar Klaczynski",
        "Walter Wang", "Xavier Hanin", "Yannick Menager"};

    public AutoCompleteExamples() {
        construct();
    }

    private void construct() {
        loadComboBox();
        
        JPanel panel = createPanel();
        
        this.setTitle("Auto Complete Example");
        this.setPreferredSize(new Dimension(500, 300));
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);

        this.getContentPane().setLayout(new BorderLayout());
        this.getContentPane().add(panel, BorderLayout.CENTER);
    }
    
    private JPanel createPanel() {
        FormLayout lm = new FormLayout(
                "pref,10px,pref,fill:default:grow,10px",
                "pref,2px,pref,20px");

        DefaultFormBuilder builder = new DefaultFormBuilder(lm);
        builder.setDefaultDialogBorder();

        CellConstraints cc = new CellConstraints();

        builder.addLabel("AutoComplete Strict", cc.xy(1, 1));
        builder.add(comboStudent, cc.xyw(3, 1,2));

        builder.addLabel("AutoComplete Non-Strict", cc.xy(1, 3));
        builder.add(comboStudent2, cc.xyw(3, 3,2));


        return builder.getPanel();
    }

    private void loadComboBox() {
        ArrayList<Student> student = new ArrayList<Student>();

        int i = 0;

        for (String p : peopleName) {
            Student newStudent = new Student(String.valueOf(i + 1), p);
            student.add(newStudent);
            i++;
        }

        student.add(0, new Student());
        comboStudent.setModel(new ListComboBoxModel<Student>(student));
        comboStudent2.setModel(new ListComboBoxModel<Student>(student));

        AutoCompleteDecorator.decorate(comboStudent);
        AutoCompleteDecorator.decorate(comboStudent2, new StudentConverter());
    }

    private class Student {

        private String id = "";
        private String name = "";

        public Student() {
        }

        public Student(String id, String name) {
            this.id = id;
            this.name = name;
        }

        public String getId() {
            return id;
        }

        public void setId(String id) {
            this.id = id;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        @Override
        public String toString() {
            return id + " " + name;
        }
    }
    
    public static class StudentConverter extends ObjectToStringConverter {

        @Override
        public String[] getPossibleStringsForItem(Object item) {
            if (item == null) {
                return null;
            }
            if (!(item instanceof Student)) {
                return new String[0];
            }
            Student student = (Student) item;
            return new String[]{
                        student.toString(), student.getName(), student.getId()
                    };
        }

        public String getPreferredStringForItem(Object item) {
            String[] possible = getPossibleStringsForItem(item);
            String preferred = null;
            if (possible != null && possible.length > 0) {
                preferred = possible[0];
            }
            return preferred;
        }
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            public void run() {
                JFrame test = new AutoCompleteExamples();
                test.pack();
                test.setLocationRelativeTo(null);
                test.setVisible(true);
            }
        });
    }
}

Sekian tutorial untuk kali ini, selamat mencoba dan semoga bermanfaat. Semoga saya dapat menulis tutorial lain yang lebih bermanfaat.



Wassalam,
Muhamad Wibawa

Tablet Android Honeycomb Terbaik Murah