JList — использование списка

Компонент JList в Java Swing используется для отображения данных в виде списка. Cписок JList можно настроить по-разному, кому как нравится. Например, при написании своего приложения «Каталога образов» мне захотелось отображать данные с помощью компонента JList так, как показано на рисунках далее.

my_jlist

Для этого пришлось писать свой так называемый renderer, который отвечает за отрисовку каждого элемента списка. Написание собственных renderer’ов думаю стоит оставить до лучших времен, однако всё равно полезно знать, что можно очень сильно изменить стандартный вид списка.

Для начала необходимо понять, как работать с JList. Как передавать данные в самом простом случае и как обеспечить настройку внешнего вида списка, используя при этом пару строчек кода.

Как я уже сказал, JList используется для отображения списка элементов, например, массива. Допустим у нас имеется массив элементов, хотим отобразить в списке JList. Тогда создаем массив с нужными данными или получаем уже готовый массив откуда-нибудь и передаем в конструктор JList вот так:

String elements = {"element 1", "element 2", "element 3"};
JList list = new JList(elements);

Вот и всё. Только что создали JList список, в который поместили три элемента. Это самый простой способ отобразить данные в JList компоненте. Как правило, при работе со списком данные в процессе работы приложения меняются и берутся из БД (или какого-то другого хранилища) в виде более сложных объектов, которые несут определенную логику в себе. Для этого используется модель, которую я попытаюсь рассмотреть позже.

Попробуем настроить внешний вид компонента Jlist, не прибегая к каким-то изощренным способам. Элементы списка можно показывать в нескольких столбцах причем можно сказать компоненту, что делать со столбцами — оставлять их высоту такими же, как высота самого компонента или же делать больше и показывать полосу прокрутки.

Рассмотрим несколько вариантов отображения элементов в компоненте JList. Настройка способа отображения элементов в списке производится при помощи метода setLayoutOrientation разработчик может изменить вид JList’а. Имеется три предопределенных типа отображения: JList.VERTICAL, JList.VERTICAL_WRAP и JList.HORIZONTAL_WRAP. Всё это константы, которые нужн опередать в метод setLayoutOrientation. JList.VERTICAL – все элементы списка отображаются в виде одного столбца. Данное значение используется в компоненте JList по умолчанию и не требует явного указания. Однако, если сделать такой вызов, то ничего не поломается.

JList list = new JList(data);
list.setLayoutOrientation(JList.VERTICAL);

jlist_vertical

Второй тип это JList.VERTICAL_WRAP – элементы списка отображаются в виде столбцов. Высота столбца определяется высотой контейнера, на котором располагается JList. То есть получается некая фиксация количества элементов по вертикали. Например, на рисунке ниже высота столбцов определяется высотой панели прокрутки, на которой располагается список. Число элементов в столбце таково, что вертикальная полоса прокрутки не появляется.

jlist_vertical_wrap

Чтобы сделать вид списка аналогичный виду списка JList на рисунке, нужно сделать вот так:

list.setLayoutOrientation(JList.VERTICAL_WRAP);

Далее есть третий тип — JList.HORIZONTAL_WRAP. Элементы списка JList также располагаются в столбцах, но с некоторой разницей. На этот раз количество элементов по горизонтали «фиксировано» — в данном случае два столбца. Для этого нужно сделать вот так:

list.setLayoutOrientation(JList.HORIZONTAL_WRAP);

jlist_horizontal_wrap

По традиции тестовый пример – в окне приложения располагается три компонента JList, для каждого компонента установлен один из трёх типов отображения элементов. Думаю, что здесь наиболее наглядно видны различия между описанными выше типами.

jlist_set_layout

import java.awt.Dimension;

import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;

public class TestFrame extends JFrame {

     public static void createGUI() {
          JFrame frame = new JFrame("Test frame");
          frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

          String[] data = { "Chrome", "Firefox", "Internet Explorer", "Safari",
                    "Opera", "Morrowind", "Oblivion", "NFS", "Half Life 2",
                    "Hitman", "Morrowind", "Oblivion", "NFS", "Half Life 2",
                    "Hitman", "Morrowind", "Oblivion", "NFS", "Half Life 2",
                    "Hitman", "Morrowind", "Oblivion", "NFS", "Half Life 2",
                    "Hitman", "Morrowind", "Oblivion", "NFS", "Half Life 2",
                    "Hitman", "IL-2", "CMR", "NFS Undercover",
                    "Star Wars", "Call of Duty", "IL-2", "CMR",
                    "NFS Undercover", "Star Wars", "Call of Duty",
                    "IL-2", "CMR", "NFS Undercover", "Star Wars",
                    "Call of Duty", "IL-2", "CMR", "NFS Undercover",
                    "Star Wars", "Call of Duty", "IL-2", "CMR",
                    "NFS Undercover", "Star Wars", "Call of Duty",
                    "IL-2", "CMR", "NFS Undercover", "Star Wars",
                    "Call of Duty", "Arena", "Dagerfall", "MS Office",
                    "Open Office", "Windows", "Arena", "Dagerfall",
                    "MS Office", "Open Office", "Windows", "Arena",
                    "Dagerfall", "MS Office", "Open Office", "Windows",
                    "Arena", "Dagerfall", "MS Office", "Open Office",
                    "Windows", "Mac OS", "Ubuntu"
          };

          JPanel mainPanel = new JPanel();
          mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.Y_AXIS));

          JList northList = new JList(data);
          northList.setLayoutOrientation(JList.VERTICAL);
          northList.setVisibleRowCount(0);

          JScrollPane northScroll = new JScrollPane(northList);
          northScroll.setPreferredSize(new Dimension(100, 100));

          JList centerList = new JList(data);
          centerList.setLayoutOrientation(JList.VERTICAL_WRAP);
          centerList.setVisibleRowCount(0);

          JScrollPane centerScroll = new JScrollPane(centerList);
          centerScroll.setPreferredSize(new Dimension(100, 100));

          JList southList = new JList(data);
          southList.setLayoutOrientation(JList.HORIZONTAL_WRAP);
          southList.setVisibleRowCount(0);

          JScrollPane southScroll = new JScrollPane(southList);
          southScroll.setPreferredSize(new Dimension(100, 100));

          mainPanel.add(northScroll);
          mainPanel.add(centerScroll);
          mainPanel.add(southScroll);

          frame.getContentPane().add(mainPanel);

          frame.setPreferredSize(new Dimension(330, 450));
          frame.pack();
          frame.setLocationRelativeTo(null);
          frame.setVisible(true);
     }

     public static void main(String[] args) {
          javax.swing.SwingUtilities.invokeLater(new Runnable() {
               public void run() {
                    JFrame.setDefaultLookAndFeelDecorated(true);
                    createGUI();
               }
          });
     }
}

Реклама

3 Responses to JList — использование списка

  1. Андрей says:

    а здесь не ошибка?
    String elements = {«element 1», «element 2», «element 3»};
    JList list = new JList(elements);
    Не так должно быть?
    String[] elements = {«element 1», «element 2», «element 3»};
    JList list = new JList(elements);

  2. Misha says:

    интересно было бы посмотреть на примеры реализации вашего рендерера

  3. Alik says:

    Как изменить физический размер самой ячейки(сделать больше)? Может нужно задать в html размер текста?

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

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

Логотип WordPress.com

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

Фотография Twitter

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

Фотография Facebook

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

Google+ photo

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

Connecting to %s

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