Показываем иконку у элементов списка JList

Как известно компонент JList служит для отображения данных в виде списка. У JList есть несколько методов по настройке внешнего вида компонента. Однако, в любом случае все элемены списка будут отображаться в виде текстовых надписей. А что же делать, если захотелось отображать у каждого элемента списка определенную иконку, например как в проводнике Windows, где каждому типу файлов сопоставлена своя иконка. Для таких целей у Java Swing есть решения.

Как JList показывает свои элементы? В обобщенном варианте вот так: взять данные из модели (здесь хранятся данные, элементы списка) и отрисовать их. А как JList отрисовывает каждый элемент списка? Для этого у него есть специальный ListCellRenderer, который и отрисовывает каждый элемент списка JList. Это интерфейс и располагается он в пакете javax.swing. У него есть единственный метод getListCellRendererComponent. По умолчанию у JList имеется дефолтовая реализация ListCellRenderer, а именно DefaultListCellRenderer. Если посмотреть на его исходный код, то он довольно внушительный (для меня был когда-то). Здесь имеются различные проверки как то, находится компонент в фокусе или нет, выделен ли элемент, который требуется отрисовать. Возвращает метод ссылку на Component, который затем и отображается в качестве элемента спсика. Если посмотреть на DefaultListCellRenderer, то он использует JLabel — наследуется от него, настраивает нужным образом в зависимости от параметров, передаваемых методу getListCellRenderer, а затем возвращает ссылку на себя то есть по сути на JLabel. Это можно использовать, чтобы показать иконку у нашего JList.

Попробуем пронаследоваться от DefaultListCellRenderer, получить ссылку на JLabel и при помощи метода setIcon установить иконку. Код метода getListCellRendererComponent будет выглядеть вот так:

public Component getListCellRendererComponent(JList list,
                         Object value, int index, boolean isSelected,
                         boolean cellHasFocus) {
                    Component component = super.getListCellRendererComponent(list,
                              value, index, isSelected, cellHasFocus);
                    JLabel label = (JLabel) component;
                    Icon icon = UIManager.getIcon("Tree.closedIcon");
                    label.setIcon(icon);
                    return label;
}

Что мы здесь делаем. Сначала получаем ссылку на Component от DefaultCellRenderer. Затем приводим её к типу JLabel. Длаее при помощи UIManager получаем иконку устанавливаем её у JLabel и возвращаем получившийся JLabel, который и отображается в компоненте JList. Посмотрим тестовый пример.

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;

import javax.swing.DefaultListCellRenderer;
import javax.swing.Icon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.ListSelectionModel;
import javax.swing.UIManager;

public class TestFrame extends JFrame {

     public TestFrame() {
          super("Test frame");
          createGUI();
     }

     public void createGUI() {
          setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

          JPanel panel = new JPanel();
          panel.setLayout(new BorderLayout());

          String[] data = { "Windows XP", "Windows Vista", "Mac OS",
                    "Chrome OS", "Ubuntu", "Linux", "Unix", "Solaris",
                    "Windows 98", "Windows 95", "Windows 2000",
                    "Windows 2003" };

          final JList list = new JList(data);

          list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);

          list.setCellRenderer(new DefaultListCellRenderer() {
               public Component getListCellRendererComponent(JList list,
                         Object value, int index, boolean isSelected,
                         boolean cellHasFocus) {
                    Component component = super.getListCellRendererComponent(list,
                              value, index, isSelected, cellHasFocus);
                    JLabel label = (JLabel) component;
                    Icon icon = UIManager.getIcon("Tree.closedIcon");
                    label.setIcon(icon);
                    return label;
               }
          });

          panel.add(new JScrollPane(list), BorderLayout.CENTER);

          getContentPane().add(panel);

          setPreferredSize(new Dimension(250, 200));
     }

     public static void main(String[] args) {
          javax.swing.SwingUtilities.invokeLater(new Runnable() {
               public void run() {
                    JFrame.setDefaultLookAndFeelDecorated(true);
                    TestFrame frame = new TestFrame();
                    frame.pack();
                    frame.setLocationRelativeTo(null);
                    frame.setVisible(true);
               }
          });
     }
}

Advertisements

One Response to Показываем иконку у элементов списка JList

  1. vrpoilwes says:

    http://mert635.narod2.ru Предлагаем програмное обеспечение ради диагностики систем персонального компьютера.

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s

%d такие блоггеры, как: