Banner Java

Memahami Dan Mengenal List cell renderer dan DefaultListCellRenderer

Di artikel Contoh Program Java: Menggunakan Kelas JList dan Memahami Dan Mengenal List Model dan DefaultListModel Di Kelas JList, Anda diperkenalkan pada list model dan penggunaan obyek list dan list model dengan elemen string. Obyek list tidak terbatas hanya menampilkan string. Anda juga dapat mengganti string dengan obyek grafis seperti image atau komponen Java lain. Kelas JList menyerahkan sepenuhnya tugas untuk menampilkan obyek grafis di setiap sel-sel list (list cells) kepada list cell renderer. Semua list cell renderer harus mengimplementasikan interface ListCellRenderer. Interface ListCellRenderer hanya mendefinisikan satu metoda yaitu getListCellRendererComponent.

Metoda getListCellRendererComponent mengembalikan sebuah komponen yang telah dikonfigurasi untuk menampilkan nilai yang ditentukan. Berikut ini adalah definisi metoda getListCellRendererComponent yang terdapat di interface ListCellRenderer.

   public Component getListCellRendererComponent(JList list, Object value, int index,
      boolean isSelected, boolean cellHasFocus)

parameter pertama adalah obyek list (kelas JList) yang digunakan untuk menampilkan cell renderer, parameter kedua adalah nilai (tipe kelas Object) yang dikembalikan oleh pernyataan list.getModel().getElementAt(index), parameter ketiga adalah indek dari sel-sel obyek list, parameter keempat bernilai boolean true apabila sel yang ditentukan dipilih, parameter kelima bernilai boolean true apabila sel yang ditentukan mendapat focus. JList menggunakan kelas DefaultListCellRenderer yang merupakan kelas turunan dari kelas JLabel dan mengimplementasikan interfes ListCellRenderer. Dengan DefaultListCellRenderer ini, sel-sel dari obyek list hanya dapat menampilkan string atau ikon (icon) saja. Berikut ini adalah hirarkhi turunan dari kelas DefaultListCellRenderer:

Hirarkhi turunan kelas DefaultListCellRenderer

Program berikut ini merupakan contoh penggunaan list cell renderer. Setiap sel di obyek list akan berisi warna dan nama warna. Warna ditampilkan dengan bantuan obyek dari kelas JButton yang diberi warna dengan menggunakan metoda setBackground, sedangkan nama warna ditampilkan dengan bantuan label. Program terdiri dari dua kelas. Kelas pertama (ButtonLabelRenderer) digunakan sebagai cell renderer. Kelas dari obyek yang digunakan sebagai cell renderer harus mengimplementasikan interface ListCellRenderer. Kelas kedua (DemoListCellRenderer) adalah program utama yang menggunakan kelas pertama. Berikut ini adalah kode program kedua kelas tersebut dan hasil eksekusinya:

// Nama file : ButtonLabelRenderer.java
// Mengkombinasikan button dan label sebagai cell renderer

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

// Deklarasi kelas
public class ButtonLabelRenderer implements ListCellRenderer {

   private JPanel panel = new JPanel();
   private JButton button = new JButton();
   private JLabel label = new JLabel("", JLabel.LEFT);
   private Border lineBorder = BorderFactory.createLineBorder(Color.BLACK, 1);
   private Border emptyBorder = BorderFactory.createEmptyBorder(2, 2, 2, 2);

   // Kontruktor tanpa argumen
   public ButtonLabelRenderer() {

      panel.setOpaque(true);
      panel.setLayout(new BorderLayout(8, 3));
      label.setPreferredSize(new Dimension(90, 25));
      panel.add(button, BorderLayout.CENTER);
      panel.add(label, BorderLayout.LINE_END);
   }

   // Mengimplementasikan metoda getListCellRendererComponent
   public Component getListCellRendererComponent(JList list, Object value,
      int index, boolean isSelected, boolean cellHasFocus) {

      Object[] duaObjek = (Object[]) value;
      button.setBackground((Color) duaObjek[0]);
      label.setText(duaObjek[1].toString());

      if (isSelected) {
         panel.setForeground(list.getSelectionForeground());
         panel.setBackground(list.getSelectionBackground());
      }
      else {
         panel.setForeground(list.getForeground());
         panel.setBackground(list.getBackground());
      }

      panel.setBorder(cellHasFocus ? lineBorder : emptyBorder);
      return panel;
   }
}

Obyek kelas ButtonLabelRenderer inilah yang ditampilkan di setiap sel dari obyek list. Tampilan kelas ButtonLabelRenderer sebenarnya terdiri dari dua komponen yaitu kelas JButton dan JLabel yang disusun di panel (baris nomor 24 dan 25). Untuk tampilan warna, Anda perlu merubah warna latar belakang dari obyek kelas JButton dan untuk tampilan nama warna, Anda dapat mengatur teks setiap label menggunakan metoda setText. Tipe dari argumen value perlu dirubah (casting) ke larik obyek karena Anda harus menyediakan dua buah data yaitu warna (Color.BLUE, Color.RED) dan string (“Blue Color”, “Red Color”). duaObjek[0] akan mengacu ke warna dan duaObjek[1] akan mengacu ke string. Anda perlu ingat kembali bahwa warna dan string tidak termasuk ke dalam tipe data primitif.

// Nama file : DemoListCellRenderer.java
// Menggunakan list cell renderer di objek list

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

// Deklarasi kelas
public class DemoListCellRenderer extends JFrame
   implements ListSelectionListener {

   final int JUMLAH_WARNA = 9;
   private DefaultListModel listModel;
   private JList list;
   private ListCellRenderer renderer;
   private JPanel panel;
   private JSplitPane splitPane;
   private JScrollPane scrollPane;

   // Konstruktor tanpa argumen
   public DemoListCellRenderer() {

      listModel = new DefaultListModel();

      // Mengkonstruksi list cell renderer
      listModel.addElement(new Object[] {Color.BLACK, "Black Color"});
      listModel.addElement(new Object[] {Color.YELLOW, "Yellow Color"});
      listModel.addElement(new Object[] {Color.MAGENTA, "Magenta Color"});
      listModel.addElement(new Object[] {Color.GREEN, "Green Color"});
      listModel.addElement(new Object[] {Color.CYAN, "Cyan Color"});
      listModel.addElement(new Object[] {Color.ORANGE, "Orange Color"});
      listModel.addElement(new Object[] {Color.BLUE, "Blue Color"});
      listModel.addElement(new Object[] {Color.PINK, "Pink Color"});
      listModel.addElement(new Object[] {Color.RED, "Red Color"});

      renderer = new ButtonLabelRenderer();

      list = new JList(listModel);
      list.setCellRenderer(renderer);
      list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
      list.addListSelectionListener(this);
      scrollPane = new JScrollPane(list);
      scrollPane.setBorder(new TitledBorder("Pilihan Warna"));

      panel = new JPanel();
      panel.setBorder(new TitledBorder("Tampilan Warna"));

      splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, true);
      splitPane.setLeftComponent(scrollPane);
      splitPane.setRightComponent(panel);
      splitPane.setOneTouchExpandable(true);

      getContentPane().add(splitPane, BorderLayout.CENTER);
   }

   // Menangani pemilihan elemen di list
   public void valueChanged(ListSelectionEvent lse) {

      Object[] duaObjek = (Object[])(list.getSelectedValue());
      panel.setBackground((Color)duaObjek[0]);
   }

   // Metoda main
   public static void main(String[] args) {
      DemoListCellRenderer frame = new DemoListCellRenderer(); 
      frame.setTitle("Kelas DemoListCellRenderer");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.setSize(370, 210);
      frame.setVisible(true);
   }
}

Baris nomor 28 – 36 di program utama (kelas DemoListCellRenderer) adalah pernyataan untuk menambahkan larik obyek (konstanta warna dan string) yang digunakan sebagai argumen parameter dari metoda setBackground dari kelas JButton dan setText dari kelas JLabel di kelas ButtonLabelRenderer. Obyek (variabel acuan renderer) dari kelas ButtonLabelRenderer kemudian dikonstruksi (baris nomor 38). List (obyek kelas JList) selanjutnya menggunakan obyek kelas ButtonLabelRenderer untuk ditampilkan di setiap sel-sel list (list cells) dengan terlebih dahulu menggunakan nilai larik obyek yang telah disediakan sebagai parameter dari metoda setBackground dan setText untuk mengatur tampilan warna obyek button dan string obyek label.

Ketika sebuah nilai (elemen) di list dipilih, nilai tersebut dapat ditangkap dengan metoda setSelectedValue dari obyek list. Nilai ini kemudian dirubah (casting) ke larik obyek dan kemudian disimpan ke variabel yang mengacu ke larik, duaObjek (baris nomor 61). duaObjek[0] yang berisi konstanta warna kemudian digunakan sebagai argumen parameter dari metoda setBackground dari obyek panel untuk memberi warna latar belakang panel (baris nomor 62). Kedua file bytecode (berekstensi .class) dari kelas ButtonLabelRenderer dan DemoListCellRenderer berada di direktori yang sama yaitu c:\hindro\javasc. Karena berada di direktori yang sama, Anda tidak perlu mengimpor kelas ButtonLabelRenderer saat digunakan di daalam program utama (kelas DemoListCellRenderer).

Menggunakan List cell renderer dan DefaultListCellRenderer

Baca artikel terkait lainnya:

Untuk memperbaiki mutu konten, Anda dapat berpartisipasi dengan cara melaporkan apabila menemukan kesalahan ketik, kata-kata rangkap, redaksi kurang pas (jelas), gambar pendukung tidak ada dan sebagainya melalui form Kontak Kami untuk mendapatkan perbaikan. Terima kasih atas kerjasamanya.

Hindro HindriantoHindro adalah pendiri sekaligus admin termasmedia.com dan topikit.com, blog online yang mengulas teknologi informasi. Dunia web mulai ditekuni tahun 2012 dengan mempelajari CMS Joomla dan Wordpress. Beberapa buku yang sekarang dipelajari antara lain PHP, HTML5, ASP.NET 4.5, JavaScript, CSS3, MySQL, Adobe Dreamweaver, Adobe Photoshop dan Adobe Flash.