Java Source - JList hiển thị các đối tượng tùy biến trong ListCellRenderer(JList component to display custom objects with ListCellRenderer).


Đoạn java source này sẽ hướng dẫn cách dùng JList để hiện thị các đối tượng tùy biến trong ListCellRenderer. Đối tượng ở đây bao gồm hình ảnh và đoạn text mô tả. Nó cũng khá hay giúp bạn hiểu hơn về cách tạo và sử dụng một đối tượng.














Dưới đây là toàn bộ source code:
 /*
Java Swing, 2nd Edition
By Marc Loy, Robert Eckstein, Dave Wood, James Elliott, Brian Cole
ISBN: 0-596-00408-7
Publisher: O'Reilly
*/
// SwingListExample.java
//An example of the JList component in action. This program uses a custom
//renderer (BookCellRenderer.java) to show a list of books with icons of their
//covers.
//

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.ListCellRenderer;

public class SwingListExample extends JPanel {

  private BookEntry books[] = {
      new BookEntry("Ant: The Definitive Guide", "1.gif"),
      new BookEntry("Database Programming with JDBC and Java", "2.gif"),
      new BookEntry("Developing Java Beans", "3.gif"),
      new BookEntry("Developing JSP Custom Tag Libraries", "4.gif"),
      new BookEntry("Java 2D Graphics", "4.gif"),
      new BookEntry("Java and XML", "5.gif"),
      new BookEntry("Java and XSLT", "1.gif"),
      new BookEntry("Java and SOAP", "2.gif"),
      new BookEntry("Learning Java", "3.gif")
    };

  private JList booklist = new JList(books);

  public SwingListExample() {
    setLayout(new BorderLayout());
    JButton button = new JButton("Print");
    button.addActionListener(new PrintListener());

    booklist = new JList(books);
    booklist.setCellRenderer(new BookCellRenderer());
    booklist.setVisibleRowCount(4);
    JScrollPane pane = new JScrollPane(booklist);

    add(pane, BorderLayout.NORTH);
    add(button, BorderLayout.SOUTH);
  }

  public static void main(String s[]) {
    JFrame frame = new JFrame("List Example");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setContentPane(new SwingListExample());
    frame.pack();
    frame.setVisible(true);
  }

  // An inner class to respond to clicks on the Print button
  class PrintListener implements ActionListener {
    public void actionPerformed(ActionEvent e) {
      int selected[] = booklist.getSelectedIndices();
      System.out.println("Selected Elements:  ");

      for (int i = 0; i < selected.length; i++) {
        BookEntry element = (BookEntry) booklist.getModel().getElementAt(selected[i]);
        System.out.println("  " + element.getTitle());
      }
    }
  }
}

class BookEntry {
  private final String title;

  private final String imagePath;

  private ImageIcon image;

  public BookEntry(String title, String imagePath) {
    this.title = title;
    this.imagePath = imagePath;
  }

  public String getTitle() {
    return title;
  }

  public ImageIcon getImage() {
    if (image == null) {
      image = new ImageIcon(imagePath);
    }
    return image;
  }

  // Override standard toString method to give a useful result
  public String toString() {
    return title;
  }
}

class BookCellRenderer extends JLabel implements ListCellRenderer {
  private static final Color HIGHLIGHT_COLOR = new Color(0, 0, 128);

  public BookCellRenderer() {
    setOpaque(true);
    setIconTextGap(12);
  }

  public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
    BookEntry entry = (BookEntry) value;
    setText(entry.getTitle());
    setIcon(entry.getImage());
    if (isSelected) {
      setBackground(HIGHLIGHT_COLOR);
      setForeground(Color.white);
    } else {
      setBackground(Color.white);
      setForeground(Color.black);
    }
    return this;
  }
}


Nguồn: java2s.com
Do tại nguồn không cung cấp image icon kèm theo nên bạn dùng tàm các icon bên dưới vào đoạn source nha.

























1 comment:

  1. Bài này được thiết kế giao diện theo dạng dòng của JList vì vậy muốn hiển thị dòng title dưới image thì cần phải xây dựng lại lớp BookEntry và BookCellRenderer.

    Tuy nhiên có một cách xử lý nhanh cho này là thay thế 2 đoạn code sau:
    ---
    private BookEntry books[] = {
    new BookEntryundefined"<html><br /><br /><br /><br /><br />Ant: The Definitive Guide</html>", "1.png"),
    new BookEntryundefined"<html><br /><br /><br /><br /><br />Database Programming with JDBC and Java</html>", "2.png"),
    new BookEntryundefined"<html><br /><br /><br /><br /><br />Developing Java Beans</html>", "3.png"),
    new BookEntryundefined"<html><br /><br /><br /><br /><br />Developing JSP Custom Tag Libraries</html>", "4.png"),
    new BookEntryundefined"<html><br /><br /><br /><br /><br />Java 2D Graphics</html>", "4.png"),
    new BookEntryundefined"<html><br /><br /><br /><br /><br />Java and XML</html>", "5.png"),
    new BookEntryundefined"<html><br /><br /><br /><br /><br />Java and XSLT</html>", "1.png"),
    new BookEntryundefined"<html><br /><br /><br /><br /><br />Java and SOAP</html>", "2.png"),
    new BookEntryundefined"<html><br /><br /><br /><br /><br />Learning Java</html>", "3.png")
    };
    ----
    -----
    public BookCellRenderer() {
    setOpaque(true);
    setIconTextGap(-40);
    }
    -----

    ReplyDelete