Pin It

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

List model dari kelas JList mengimplementasikan interface ListModel yang telah mendefinisikan metoda registrasi untuk ListDataEvent dan beberapa metoda lainnya. Kemudian kelas abstrak AbstractListModel mengimplementasikan metoda registrasi yang ada di interfes ListModel. Implementasi konkrit dari list model adalah kelas DefaultListModel yang merupakan perluasan dari kelas abstrak AbstractListModel. Metoda-metoda kelas DefaultListModel mirip dengan yang terdapat di kelas Vector (penjelasan mengenai kelas Vector dapat diperoleh secara lengkap dari internet). Berikut ini adalah tabel beberapa metoda kelas DefaultListModel yang sering digunakan:

Tabel metoda kelas DefaultListModel
MetodaKeterangan
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 aplikasi dijalankan, obyek list akan memiliki 15 elemen (item) yaitu dari Elemen 1, Elemen 2 s/d Elemen 15. Obyek list di contoh program ini 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 yang berkaitan dengan elemen (menambah, menghapus dan merubah elemen) dicatat dan ditampilkan di obyek text area.

Ketika tombol tambah diklik, pernyataan di blok baris nomor 56 – 78 akan dieksekusi dengan menampilkan kotak dialog input elemen. Apabila elemen yang ditambahkan sudah ada di list, kotak dialog pesan akan ditampilkan dengan memberitahukan bahwa elemen yang ditambahkan sudah ada dan kemudian membatalkan penambahan. Apabila salah satu elemen yang terdapat di obyek list tidak disorot, maka elemen yang ditambahkan akan ditempatkan di posisi akhir di obyek list dengan menggunakan metoda addElemen (baris nomor 67) dan apabila salah satu elemen di list disorot, maka elemen akan ditambahkan dan ditempatkan di posisi indek dari elemen yang disorot dengan menggunakan metoda add (baris nomor 71).

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

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

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