Spec-Zone .ru
спецификации, руководства, описания, API
След: Создание GUI С JFC/Swing
Урок: Используя Компоненты Swing
Раздел: Как Использовать Различные Компоненты
Как Использовать Списки
Домашняя страница > Создание GUI С JFC/Swing > Используя Компоненты Swing

Как Использовать Списки

A JList дарит пользователю группу элементов, выведенных на экран в одном или более столбцах, чтобы выбрать из. У списков может быть много элементов, таким образом, они часто помещаются в области прокрутки.

В дополнение к спискам следующие компоненты Swing представляют многократные выбираемые элементы пользователю: поля комбинированного списка, меню, таблицы, и группы флажков или переключателей. Чтобы вывести на экран иерархические данные, используйте дерево.

Следующие данные показывают два приложения то использование списки. Этот раздел использует эти примеры в качестве основания для обсуждений, которые следуют.

Снимок ListDialog, который выводит на экран простой список Снимок ListDemo, который позволяет Вам добавлять и удалять элементы списка
ListDialog
(используемый ListDialogRunner)
ListDemo

Попробуйте это: 
  1. Нажмите кнопку Launch, чтобы работать, ListDemo, используя Сеть Java™ Запускаются (загрузите JDK 6 или позже). Альтернативно, чтобы скомпилировать и выполнить пример самостоятельно, консультируйтесь, пример индексируют.Запускает пример ListDemo
  2. Нажмите кнопку Launch, чтобы выполнить ListDialogRunner. Альтернативно, чтобы скомпилировать и выполнить пример самостоятельно, консультируйтесь, пример индексируют.Запускает пример ListDialogRunner
  3. Чтобы перевести ListDialog в рабочее состояние, щелкните по Выбору новое имя... кнопка в окне названное Имя Тот Ребенок.
    Получающееся диалоговое окно является экземпляром ListDialog, который был настроен, чтобы иметь Селектора Имени title.
  4. В ListDemo попытайтесь добавить (наем) и удаление (увольнения) нескольких элементов.

Этот отдых этого раздела обсуждает следующие темы:

Создание Модели

Есть три способа создать модель списка:

Инициализация Списка

Вот код от ListDialog.java это создает и устанавливает его список:

list = new JList(data); //data has type Object[]
list.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
list.setLayoutOrientation(JList.HORIZONTAL_WRAP);
list.setVisibleRowCount(-1);
...
JScrollPane listScroller = new JScrollPane(list);
listScroller.setPreferredSize(new Dimension(250, 80));

Код передает массив конструктору списка. Массив переполнен строками, в которых передали от другого объекта. В нашем примере строки, оказывается, имена мальчиков.

Другой JList конструкторы позволяют Вам инициализировать список от a Vector или от объекта, который придерживается ListModel интерфейс. Если Вы инициализируете список с массивом или вектором, конструктор неявно создает модель списка значения по умолчанию. Модель списка значения по умолчанию является неизменной — невозможно добавить, удалить, или заменить элементы в списке. Чтобы создать список, элементы которого могут быть изменены индивидуально, устанавливает модель списка в экземпляр изменчивой модели списка class, такой как экземпляр DefaultListModel. Можно установить модель списка, когда Вы создаете список или вызывая setModel метод. См. Добавляющие Элементы к и Элементы Удаления от Списка для примера.

Звонок setSelectionMode определяет, сколько элементов пользователь может выбрать, и должны ли они быть непрерывными; следующий раздел говорит Вам больше о режимах выбора.

Звонок setLayoutOrientation позволяет списку выводить на экран свои данные в многократных столбцах. Значение JList.HORIZONTAL_WRAP определяет, что список должен вывести на экран свои элементы слева направо прежде, чем перенестись к новой строке. Другое возможное значение JList.VERTICAL_WRAP, который определяет, что данные выводятся на экран сверху донизу (как обычно) прежде, чем перенестись к новому столбцу. Следующие данные показывают эти две переносящихся возможности, вместе со значением по умолчанию, JList.VERTICAL.

HORIZONTAL_WRAP VERTICAL_WRAP ВЕРТИКАЛЬ
HORIZONTAL_WRAP VERTICAL_WRAP VERTICAL

В комбинации со звонком setLayoutOrientation, вызов setVisibleRowCount(-1) входит в список вывести на экран максимальное количество элементов, возможных в экранном свободном месте. Другое обычное использование setVisibleRowCount должен определить к области прокрутки списков, сколько строк список предпочитает выводить на экран.

Выбор Элементов в Списке

Список использует экземпляр ListSelectionModel управлять его выбором. По умолчанию модель выбора списка позволяет любой комбинации элементов быть выбранной за один раз. Можно определить различный режим выбора, вызывая setSelectionMode метод в списке. Например, оба ListDialog и ListDemo установите режим выбора в SINGLE_SELECTION (константа, определенная ListSelectionModel) так, чтобы только один элемент в списке мог быть выбран. Следующая таблица описывает три режима выбора списка:

Режим Описание
SINGLE_SELECTION
Единственный выбор означает, что только один элемент может быть выбран сразу

Только один элемент может быть выбран за один раз. Когда пользователь выбирает элемент, любой ранее, что выбранный пункт является невыбранным сначала.
SINGLE_INTERVAL_SELECTION
Единственные средства выбора интервала многократные, непрерывные элементы могут быть выбраны сразу

Могут быть выбраны многократные, непрерывные элементы. Когда пользователь начинает новый диапазон выбора, любой ранее, что выбранные пункты являются невыбранными сначала.
MULTIPLE_INTERVAL_SELECTION 
Многократный выбор интервала означает, что любая комбинация элементов может быть выбрана сразу

Значение по умолчанию. Любая комбинация элементов может быть выбрана. Пользователь должен явно отменить выбор элементов.

Независимо от того, который режим выбора Ваше использование списка, список запускает события выбора списка всякий раз, когда выбор изменяется. Можно обработать эти события, добавляя слушателя выбора списка списка с addListSelectionListener метод. Слушатель выбора списка должен реализовать один метод: valueChanged. Вот valueChanged метод для слушателя в ListDemo:

public void valueChanged(ListSelectionEvent e) {
    if (e.getValueIsAdjusting() == false) {

        if (list.getSelectedIndex() == -1) {
        //No selection, disable fire button.
            fireButton.setEnabled(false);

        } else {
        //Selection, enable the fire button.
            fireButton.setEnabled(true);
        }
    }
}

Много событий выбора списка могут быть сгенерированы от единственного пользовательского действия, такого как щелчок мышью. getValueIsAdjusting возвраты метода true если пользователь все еще управляет выбором. Эта определенная программа интересуется только окончательным результатом действия пользователя, таким образом, valueChanged метод делает что-то только если getValueIsAdjusting возвраты false.

Поскольку список находится в единственном режиме выбора, этот код может использовать getSelectedIndex получить индексирование справедливого выбранного пункта. JList обеспечивает другие методы для установки или получения выбора, когда режим выбора позволяет больше чем одному элементу быть выбранным. Если Вы хотите, можно прислушаться к событиям на модели выбора списка списка, а не в списке непосредственно. ListSelectionDemo является примером, который показывает, как прислушаться к событиям выбора списка на модели выбора списка и позволяет Вам изменять режим выбора списка динамически.

Добавление Элементов к и Удаление Элементов от Списка

Пример ListDemo, который мы показали ранее, обладает списком, содержание которого может измениться. Можно найти исходный код для ListDemo в ListDemo.java. Вот код ListDemo, который создает изменчивый объект модели списка, помещает начальные элементы в него, и использует модель списка, чтобы создать список:

listModel = new DefaultListModel();
listModel.addElement("Jane Doe");
listModel.addElement("John Smith");
listModel.addElement("Kathy Green");


list = new JList(listModel);

Эта определенная программа использует экземпляр DefaultListModel, class обеспечил Swing. Несмотря на имя class, у списка нет a DefaultListModel если Ваша программа явно не делает это так. Если DefaultListModel не удовлетворяет Вашим потребностям, можно записать пользовательскую модель списка, которая должна придерживаться ListModel интерфейс.

Следующий фрагмент кода показывает actionPerformed метод для слушателя действия зарегистрировался на кнопке Fire. Полужирная строка кода удаляет выбранный пункт в списке. Остающиеся строки в методе отключают кнопку огня, если список теперь пуст, и сделайте другой выбор, если это не.

public void actionPerformed(ActionEvent e) {
    int index = list.getSelectedIndex();
    listModel.remove(index);

    int size = listModel.getSize();

    if (size == 0) { //Nobody's left, disable firing.
        fireButton.setEnabled(false);

    } else { //Select an index.
        if (index == listModel.getSize()) {
            //removed item in last position
            index--;
        }

        list.setSelectedIndex(index);
        list.ensureIndexIsVisible(index);
    }
}

Вот actionPerformed метод для слушателя действия, совместно использованного кнопкой Hire и текстовым полем:

public void actionPerformed(ActionEvent e) {
    String name = employeeName.getText();

    //User did not type in a unique name...
    if (name.equals("") || alreadyInList(name)) {
        Toolkit.getDefaultToolkit().beep();
        employeeName.requestFocusInWindow();
        employeeName.selectAll();
        return;
    }

    int index = list.getSelectedIndex(); //get selected index
    if (index == -1) { //no selection, so insert at beginning
        index = 0;
    } else {           //add after the selected item
        index++;
    }

    listModel.insertElementAt(employeeName.getText(), index);

    //Reset the text field.
    employeeName.requestFocusInWindow();
    employeeName.setText("");

    //Select the new item and make it visible.
    list.setSelectedIndex(index);
    list.ensureIndexIsVisible(index);
}

Этот код использует модель списка insertElementAt метод, чтобы вставить новое имя после текущего выбора или, если никакой выбор не существует, в начале списка. Если Вы только хотите добавить до конца списка, можно использовать DefaultListModel's addElement метод вместо этого.

Всякий раз, когда элементы добавляются к, удалили из, или изменили в списке, событиях данных списка огней модели списка. Обратитесь к тому, Как Записать Слушателю Данных Списка для информации о прислушивании к этим событиям. Тот раздел содержит пример, который подобен ListDemo, но добавляет, застегивает то перемещение элементы или вниз в списке.

Запись Пользовательского Средства рендеринга Ячейки

Список использует объект, названный средством рендеринга ячейки, чтобы вывести на экран каждый из его элементов. Средство рендеринга ячейки значения по умолчанию знает, как вывести на экран строки и значки, и оно выводит на экран Objects, вызывая toString. Если Вы хотите изменить путь значки дисплея средства рендеринга значения по умолчанию или строки, или если Вы хотите поведение, отличающееся чем, чем обеспечивают toString, можно реализовать пользовательское средство рендеринга ячейки. Сделайте эти шаги, чтобы обеспечить пользовательское средство рендеринга ячейки для списка:

Мы не обеспечиваем пример списка с пользовательским средством рендеринга ячейки, но у нас действительно есть пример поля комбинированного списка с пользовательским средством рендеринга — и поля комбинированного списка используют тот же самый тип средства рендеринга как списки. См. пример, описанный в Обеспечении Пользовательского Средства рендеринга.

API Списка

Следующие таблицы приводят обычно используемый JList конструкторы и методы. Другие методы Вы, наиболее вероятно, вызовете на a JList объект - те такой как setPreferredSize то, что его суперклассы обеспечивают. См. API JComponent для таблиц обычно используемых наследованных методов.

Большой частью работы списка управляют другие объекты. Элементами в списке управляет объект модели списка, выбором управляют объект модели выбора списка, и большинство программ, помещенных список в области прокрутки, чтобы обработать прокрутку. По большей части Вы не должны волноваться о моделях потому что JList создает их по мере необходимости, и Вы взаимодействуете с ними неявно с JList's методы удобства.

Однако API для того, чтобы использовать списки попадает в эти категории:

Инициализация Данных Списка
Метод или Конструктор Цель
JList (ListModel)
JList (Объект [])
JList (Вектор)
JList ()
Создайте список с начальными определенными элементами списка. Вторые и третьи конструкторы неявно создают неизменное ListModel; недопустимо впоследствии изменить переданный - в массиве или Vector.
освободите setModel (ListModel)
ListModel getModel ()
Набор или получает модель, которая содержит содержание списка.
освободите setListData (Объект [])
освободите setListData (Вектор)
Установите элементы в списке. Эти методы неявно создают неизменное ListModel.
Отображение Списка
Метод Цель
освободите setVisibleRowCount (интервал)
интервал getVisibleRowCount ()
Набор или добирается visibleRowCount свойство. Для a VERTICAL ориентация расположения, это устанавливает или заставляет привилегированное число строк выводить на экран, не требуя прокрутки. Для HORIZONTAL_WRAP или VERTICAL_WRAP ориентации расположения, это определяет, как ячейки переносятся. См. setLayoutOrientation (интервал) для получения дополнительной информации. Значение по умолчанию этого свойства VERTICAL.
освободите setLayoutOrientation (интервал)
интервал getLayoutOrientation ()
Набор или получает способ, которым размечаются ячейки списка. Возможные форматы расположения определяются JList- определенные значения VERTICAL (единственный столбец ячеек; значение по умолчанию), HORIZONTAL_WRAP ("газетный" стиль с контентом, текущим горизонтально тогда вертикально), и VERTICAL_WRAP ("газетный" стиль с контентом, текущим вертикально тогда горизонтально).
интервал getFirstVisibleIndex ()
интервал getLastVisibleIndex ()
Получите индексирование первого или последнего видимого элемента.
освободите ensureIndexIsVisible (интервал) Прокрутите так, чтобы указанные индексировали, видимо в пределах области просмотра, в которой находится этот список.
Управление Выбором Списка
Метод Цель
освободите addListSelectionListener (ListSelectionListener) Регистр, чтобы получить уведомление об изменениях выбора.
освободите setSelectedIndex (интервал)
освободите setSelectedIndices (интервал [])
освободите setSelectedValue (Объект, булев)
освободите setSelectionInterval (интервал, интервал)
Установите текущий выбор как обозначено. Использовать setSelectionMode установить, какие диапазоны выборов являются приемлемыми. Булев параметр определяет, должен ли список попытаться прокрутить себя так, чтобы выбранный пункт был видим.
интервал getAnchorSelectionIndex ()
интервал getLeadSelectionIndex ()
интервал getSelectedIndex ()
интервал getMinSelectionIndex ()
интервал getMaxSelectionIndex ()
интервал [] getSelectedIndices ()
Возразите getSelectedValue ()
Объект [] getSelectedValues ()
Получите информацию о текущем выборе как обозначено.
освободите setSelectionMode (интервал)
интервал getSelectionMode ()
Набор или получает режим выбора. Приемлемые значения: SINGLE_SELECTION, SINGLE_INTERVAL_SELECTION, или MULTIPLE_INTERVAL_SELECTION (значение по умолчанию), которые определяются в ListSelectionModel.
освободите clearSelection ()
булев isSelectionEmpty ()
Набор или добирается, выбираются ли какие-либо элементы.
булев isSelectedIndex (интервал) Определите, индексируют ли указанные, выбирается.
Управление Данными Списка
Класс или Метод Цель
интервал getNextMatch (Строка, интервал, javax.swing.text. Позиция. Смещение) Учитывая начальное значение индекса, переройте список для элемента, который запускается с указанной строки, и возвратитесь, которые индексируют (или-1, если строка не находится). Третий параметр, который определяет направление поиска, может быть также Position.Bias.Forward или Position.Bias.Backward. Например, если у Вас есть список с 6 элементами, getNextMatch("Matisse", 5, javax.swing.text.Position.Bias.Forward) поиски строки "Матисс" в элементе в индексируют 5, тогда (в случае необходимости) в индексируют 0, индексируют 1, и так далее.
освободите (булев) setDragEnabled
булев getDragEnabled ()
Набор или получает свойство, которое определяет, перетаскивают ли автоматический обработку, включается. См. Перетаскивают и Отбрасывание и Передача данных для большего количества деталей.

Примеры то Использование Списки

Эта таблица показывает примеры то использование JList и где те примеры описываются.

Пример Где Описано Примечания
SplitPaneDemo Как Использовать Разделенные области Содержит единственный выбор, неизменный список.
ListDemo Этот раздел Демонстрирует, как добавить и удалить элементы из списка во времени выполнения.
ListDialog Этот раздел, Как Использовать BoxLayout Реализует модальное диалоговое окно с единственным списком выбора.
ListDataEventDemo Как Записать Слушателю Данных Списка Демонстрирует, как прислушиваться к событиям данных списка на модели списка.
ListSelectionDemo Как Записать Слушателю Выбора Списка Содержит список и таблицу, которые совместно используют ту же самую модель выбора. Можно динамически выбрать режим выбора.
SharedModelDemo Используя Модели Изменяет ListSelectionDemo так, чтобы список и таблица совместно использовали ту же самую модель данных.
CustomComboBoxDemo Обеспечение Пользовательского Средства рендеринга Шоу, как обеспечить пользовательское средство рендеринга для поля комбинированного списка. Поскольку списки и поля комбинированного списка используют тот же самый тип средства рендеринга, можно использовать то, что Вы изучаете там применение этого к спискам. Фактически, список и поле комбинированного списка могут совместно использовать средство рендеринга.

См. Использование JavaFX Средства управления UI: учебное руководство по Представлению Списка, чтобы изучить, как создать списки в JavaFX.


Проблемы с примерами? Попытайтесь Компилировать и Выполнить Примеры: FAQ.
Жалобы? Поздравление? Предложения? Дайте нам свою обратную связь.

Предыдущая страница: Как Использовать Многоуровневые Области
Следующая страница: Как Использовать Меню