Mengenal List Mode dan DefaultListModel kelas JList di program Java
List Model Dan DefaultListModel

Di artikel Contoh Program Java Menggunakan Kelas JList, Anda diberi contoh program tentang kelas JList terkait penggunaan list model. Kelas JList tidak mempunyai metoda untuk melakukan operasi penambahan atau penghapusan elemen. Daftar elemen yang ada di obyek list bersifat tetap. Untuk operasi penambahan, penghapusan serta perubahan elemen di obyek list, Anda perlu menggunakan list model. List model bertanggung jawab menangani pengelolaan data (elemen) di obyek list.

List model kelas JList mengimplementasikan interface ListModel yang telah mendefinisikan metoda registrasi untuk ListDataEvent dan beberapa metoda lainnya. Kemudian, kelas AbstractListModel mengimplementasikan metoda registrasi yang ada di interfes ListModel. Implementasi konkrit list model adalah kelas DefaultListModel yang merupakan perluasan kelas abstrak AbstractListModel. Metoda kelas DefaultListModel mirip dengan kelas Vector. Berikut ini adalah tabel beberapa metoda kelas DefaultListModel yang sering digunakan:

Tabel metoda kelas DefaultListModel

Metoda Keterangan
add(int index, Object element) Menambahkan elemen pada posisi yang telah ditentukan.
addElement(Object element) Menambahkan elemen di posisi akhir di list.
capacity() Mengembalikan kapasitas dari list saat ini.
clear() Menghapus semua elemen yang terdapat di list.
contains(Object element) Mengembalikan niali boolean true apabila obyek tertentu adalah elemen yang ada di list.
capyInto(Object[] array) Menyalin elemen list ke larik tertentu.
elementAt(int index) Mengembalikan elemen di indek tertentu.
firstElement() Mengembalikan elemen pertama dari list.
get(int index) Mengembalikan elemen pada posisi tertentu di list.
getElementAt(int index) Mengembalikan elemen pada indek tertentu.
getSize() Mengembalikan jumlah elemen di list.
insertElementAt(Object obj, int index) Menyisipkan obyek tertentu sebagai element di list pada indek yang telah ditentukan.
isEmpty() Untuk mengetahui apakah obyek list berisi elemen.
lastElement() Mengembalikan elemen terakhir dari list.
remove(int index) Menghapus elemen di posisi tertentu di list.
set(int index, Object element) Mengganti elemen di posisi tertentu di list dengan elemen yang telah ditentukan.
setElementAt(Object element, int index) Mengatur ulang elemen pada indek tertentu di list menjadi obyek tertentu.
size() Mengembalikan jumlah elemen di list.
toArray() Mengembalikan larik obyek yang berisi semua elemen di list dengan urutan yang benar.

Contoh program berikut ini mendemonstrasikan bagaimana melakukan operasi untuk menambah, menghapus dan merubah elemen di list. Kelas JList tidak mempunyai metoda untuk operasi tersebut, Anda harus menggunakan list model yang bertanggung jawab untuk menangani manajemen data (pengelolaan elemen). Berikut ini adalah kode program dan hasil eksekusinya:

// Nama file : MenggunakanListModel.java
// Menggunakan list model untuk menambah, menghapus dan merubah elemen

// Mengimpor kelas
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.TitledBorder;

// Deklarasi kelas
public class MenggunakanListModel extends JFrame {

   private int jmlElemenAwal = 15;
   private JButton jbtTambah, jbtHapus, jbtRubah;
   private JList list;
   private DefaultListModel listModel;
   private JTextArea textArea;
   private JScrollPane scrollPane1, scrollPane2;

   public MenggunakanListModel() {

      // Mengkonstruksi list model dan menambahkan elemen
      listModel = new DefaultListModel();
      for (int x = 0; x < jmlElemenAwal; x++)
         listModel.addElement("Elemen " + (x + 1));

      list = new JList(listModel);
      scrollPane1 = new JScrollPane(list);
      scrollPane1.setBorder(new TitledBorder("Daftar Elemen"));

      textArea = new JTextArea();
      textArea.setEditable(false);
      textArea.setText("Jumlah elemen awal di list : " + jmlElemenAwal);
      scrollPane2 = new JScrollPane(textArea);
      scrollPane2.setBorder(new TitledBorder("Operasi List"));

      JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, true);
      splitPane.setLeftComponent(scrollPane1);
      splitPane.setRightComponent(scrollPane2);
      splitPane.setOneTouchExpandable(true);

      jbtTambah = new JButton("Tambah");
      jbtHapus = new JButton("Hapus");
      jbtRubah = new JButton("Rubah");

      JPanel panel = new JPanel();
      panel.setLayout(new GridLayout(1, 3, 0, 3));
      panel.add(jbtTambah);
      panel.add(jbtHapus);
      panel.add(jbtRubah);

      getContentPane().setLayout(new BorderLayout(4, 0));
      getContentPane().add(splitPane, BorderLayout.CENTER);
      getContentPane().add(panel, BorderLayout.PAGE_END);

      jbtTambah.addActionListener(new ActionListener() {
         public void actionPerformed(ActionEvent ae) {
            String newElemen = 
               JOptionPane.showInputDialog("Masukkan elemen baru");
        
            if (newElemen != null) {
               if (listModel.contains(newElemen))
                  JOptionPane.showMessageDialog(null, "Elemen sudah ada.",
                     "Tambah Elemen", JOptionPane.INFORMATION_MESSAGE);
               else {
                  if (list.getSelectedIndex() == -1) {
                    listModel.addElement(newElemen);                
                    textArea.append("\nMenambah " + newElemen + " di posisi akhir");
                 }
                 else {
                    listModel.add(list.getSelectedIndex(), newElemen);
                    textArea.append("\nMenambah " + newElemen + 
                       " pada indek " + list.getSelectedIndex());
                 }
              }
           }
        }
     });

     jbtHapus.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent ae) {
           if (list.getSelectedIndex() == -1) 
              JOptionPane.showMessageDialog(null, "Pilih elemen yang akan dihapus",
                 "Hapus Elemen", JOptionPane.INFORMATION_MESSAGE);
           else {
              Object strElemen = listModel.getElementAt(list.getSelectedIndex());
              textArea.append("\nMenghapus " + strElemen);
              listModel.remove(list.getSelectedIndex());
           }
        }
     });

     jbtRubah.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent ae) {
           if (list.getSelectedIndex() == -1) 
              JOptionPane.showMessageDialog(null, "Pilih elemen yang dirubah",
                 "Rubah Elemen", JOptionPane.INFORMATION_MESSAGE);
           else {
              String newElemen = 
                 JOptionPane.showInputDialog("Masukkan elemen pengganti");
              if (newElemen != null) {
                 Object strElemen = listModel.getElementAt(list.getSelectedIndex());
                 listModel.set(list.getSelectedIndex(), newElemen);
                 textArea.append("\nMerubah " + strElemen + " menjadi " + newElemen);
               }
            }
         }
      });
   }

   // Metoda main
   public static void main(String[] args) {
      MenggunakanListModel frame = new MenggunakanListModel();
      frame.setTitle("Kelas MenggunakanListModel");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.setSize(400, 200);
      frame.setVisible(true);
   }
}
List Model dan DefaultListModel Dari Kelas JList

Pertama kali program berjalan, obyek list memiliki 15 elemen (item) yaitu Elemen 1, Elemen 2 s/d Elemen 15. Obyek list menggunakan kelas DefaultListModel sebagai tempat semua elemen (baris nomor 23 - 25). Variabel yang mengacu ke obyek kelas DefaultListModel kemudian digunakan sebagai argumen parameter konstruktor saat obyek kelas JList dikonstruksi (baris nomor 27). Setiap operasi menambah, menghapus dan merubah elemen dicatat dan ditampilkan di obyek text area.

Ketika tombol tambah diklik, pernyataan di blok nomor 56 – 78 dieksekusi dengan menampilkan kotak dialog input elemen. Bila elemen yang ditambahkan sudah ada di list, kotak dialog pesan ditampilkan untuk memberitahu bahwa elemen sudah ada dan kemudian membatalkan penambahan.

Bila salah satu elemen di obyek list tidak disorot, maka elemen yang ditambahkan ditempatkan di posisi akhir di obyek list menggunakan metoda addElemen (baris nomor 67). Bila salah satu elemen di list disorot, elemen ditambahkan dan ditempatkan di posisi indek dari elemen yang disorot menggunakan metoda add (baris nomor 71).

Ketika tombol hapus diklik, pernyataan di blok nomor 80 – 91 dieksekusi. Kotak dialog pesan ditampilkan dengan memberitahu untuk memilih elemen yang akan dihapus bila belum ada elemen (item) di list yang disorot. Elemen yang disorot menunjukkan elemen yang dipilih untuk dihapus. Bila salah satu elemen telah disorot, elemen tersebut akan dihapus menggunakan metoda remove dengan argumen berupa indek elemen yang disorot (baris nomor 88).

Ketika tombol ubah diklik, pernyataan di blok nomor 93 – 109 dieksekusi. Anda terlebih dahulu harus memilih elemen yang akan diubah atau kotak dialok pesan akan muncul yang menyarankan untuk memilih elemen yang akan diubah tampilannya. Bila elemen yang akan dirubah telah dipilih, kotak dialok berikutnya akan muncul sebagai sarana memasukkan elemen pengganti yang kemudian disimpan di variabel newElemen.

Baris nomor 102 adalah pernyataan untuk menyimpan elemen yang diubah di variabel strElemen menggunakan metoda getElementAt dengan argumen berupa indek dari elemen yang dipilih (list.getSelectedIndex()) untuk maksud pencatatan operasi elemen ke obyek text area. Baris nomor 103 adalah pernyataan untuk mengubah elemen menggunakan metoda set dengan argumen pertama indek elemen yang dipilih dan argumen kedua nama elemen baru yang digunakan untuk mengubah.