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

Как Использовать Поля комбинированного списка

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

Недоступное для редактирования поле комбинированного списка
Доступное для редактирования поле комбинированного списка
Недоступное для редактирования поле комбинированного списка
Доступное для редактирования поле комбинированного списка
Недоступное для редактирования поле комбинированного списка, перед (вершиной)
и после того, как кнопка нажимается
Доступное для редактирования поле комбинированного списка, прежде и после
кнопка стрелки нажимается

Поля комбинированного списка требуют небольшого экранного пространства, и их доступное для редактирования (текстовое поле) форма полезно для разрешения пользователю быстро выбирать значение, не ограничивая пользователя выведенными на экран значениями. Другие компоненты, которые могут вывести на экран варианты "один из многих", являются группами переключателей и списков. Группы переключателей являются обычно самыми легкими для пользователей понять, но поля комбинированного списка могут быть более соответствующими, когда пространство ограничивается или больше, чем несколько вариантов доступны. Списки не ужасно привлекательны, но они являются более соответствующими чем поля комбинированного списка, когда число элементов является большим (скажите, более чем 20), или когда выбор многократных элементов мог бы быть допустимым.

Поскольку доступные для редактирования и недоступные для редактирования поля комбинированного списка столь отличаются, этот раздел обрабатывает их отдельно. Этот раздел затрагивает эти темы:

Используя Недоступное для редактирования Поле комбинированного списка

Приложение, показанное здесь, использует недоступное для редактирования поле комбинированного списка для того, чтобы выбрать любимое изображение:

Недоступное для редактирования поле комбинированного списка


Попробуйте это: 
  1. Нажмите кнопку Launch, чтобы работать, Демонстрационный пример ComboBox, использующий Сеть Java™, Запускаются (загрузите JDK 6 или позже). Альтернативно, чтобы скомпилировать и выполнить пример самостоятельно, консультируйтесь, пример индексируют.Запускает пример ComboBoxDemo

  2. Выберите имя животных из поля комбинированного списка, чтобы просмотреть его изображение.
  3. Сравните работу и GUI этой программы к тому, который использует переключатели: выполните RadioButtonDemo (он требует выпуска 6). Вы могли бы хотеть сравнить исходный код также: ComboBoxDemo.java по сравнению с. RadioButtonDemo.java.

Следующий код, взятый от ComboBoxDemo.java, создает недоступное для редактирования поле комбинированного списка и устанавливает это:

String[] petStrings = { "Bird", "Cat", "Dog", "Rabbit", "Pig" };

//Create the combo box, select item at index 4.
//Indices start at 0, so 4 specifies the pig.
JComboBox petList = new JComboBox(petStrings);
petList.setSelectedIndex(4);
petList.addActionListener(this);

Это поле комбинированного списка содержит массив строк, но Вы могли так же, как легко использовать значки вместо этого. Поместить что-либо еще в поле комбинированного списка или настроить, как элементы во взгляде поля комбинированного списка, Вы должны записать пользовательское средство рендеринга. Доступное для редактирования поле комбинированного списка также нуждалось бы в пользовательском редакторе. Обратитесь к Обеспечению Пользовательского Средства рендеринга для информации и примера.

Предыдущие кодовые регистры слушатель действия на поле комбинированного списка. Чтобы видеть реализацию слушателя действия и узнать о других типах слушателей, поддерживаемых полем комбинированного списка, обратитесь к Обработке Событий на Поле комбинированного списка.

Независимо от того, который конструктор Вы используете, поле комбинированного списка использует модель поля комбинированного списка, чтобы содержать и управлять элементами в ее меню. Когда Вы инициализируете поле комбинированного списка с массивом или вектором, поле комбинированного списка создает объект модели значения по умолчанию для Вас. Как с другими компонентами Swing, можно настроить поле комбинированного списка частично, реализовывая пользовательскую модель — объект, который реализует ComboBoxModel интерфейс.  


Отметьте: 

Будьте осторожны, реализовывая пользовательскую модель для поля комбинированного списка. JComboBox методы, которые изменяют элементы в меню поля комбинированного списка, такой как insertItemAt, работайте, только если модель данных реализует MutableComboBoxModel интерфейс (подынтерфейс ComboBoxModel). Обратитесь к таблицам API, чтобы видеть, на какие методы влияют.

Что-то еще, чтобы не упустить — даже для недоступных для редактирования полей комбинированного списка — гарантирует, что Ваша пользовательская модель запускает события данных списка когда данные поля комбинированного списка или изменения состояния. Даже неизменные модели поля комбинированного списка, данные которых никогда не изменяются, должны запустить событие данных списка (a CONTENTS_CHANGED событие), когда выбор изменяется. Один способ получить код увольнения события данных списка бесплатно состоит в том, чтобы заставить Ваше поле комбинированного списка смоделировать подкласс AbstractListModel.


Обработка Событий на Поле комбинированного списка

Вот код от ComboBoxDemo.java это регистрирует и реализует слушателя действия на поле комбинированного списка:

public class ComboBoxDemo ... implements ActionListener {
    . . .
        petList.addActionListener(this) {
    . . .
    public void actionPerformed(ActionEvent e) {
        JComboBox cb = (JComboBox)e.getSource();
        String petName = (String)cb.getSelectedItem();
        updateLabel(petName);
    }
    . . .
}

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

Поля комбинированного списка также генерируют события элемента, которые запускаются когда любое из изменений состояния выбора элементов. Только один элемент за один раз может быть выбран в поле комбинированного списка, так, когда пользователь делает новый выбор ранее, выбранный пункт становится отменявшим. Таким образом два события элемента запускаются каждый раз, когда пользователь выбирает различный элемент из меню. Если пользователь выбирает тот же самый элемент, никакие события элемента не запускаются. Использовать addItemListener зарегистрировать слушателя элемента на поле комбинированного списка. Как Записать, что Слушатель Элемента дает общую информацию о реализации слушателей элемента.

Хотя JComboBox наследовал методы, чтобы зарегистрировать слушателей для низкоуровневых событий — фокус, ключ, и события от нажатия мыши, например — мы рекомендуем, чтобы Вы не прислушались к низкоуровневым событиям на поле комбинированного списка. Вот то, почему: поле комбинированного списка является составным компонентом — оно состоит из двух или больше других компонентов. Само поле комбинированного списка запускает высокоуровневые события, такие как события действия. Его субкомпоненты запускают низкоуровневые события, такие как мышь, ключ, и события фокуса. Низкоуровневые события и субкомпонент, который увольняет их, являются зависимым стилем. Чтобы избежать писать стили зависимый код, следует слушать только для высокоуровневых событий на составном компоненте, таких как поле комбинированного списка. Для получения информации о событиях, включая дискуссию о высоком - и низкоуровневых событиях, обращаются к Пишущим Слушателям События.

Используя Доступное для редактирования Поле комбинированного списка

Вот изображение демонстрационного приложения, которое использует доступное для редактирования поле комбинированного списка, чтобы ввести образец, с которым можно отформатировать даты.

Доступное для редактирования поле комбинированного списка

Попробуйте это: 
  1. Нажмите кнопку Launch, чтобы работать, Демонстрационный пример ComboBox2, используя Сеть Java™ Запускаются (загрузите JDK 6 или позже). Альтернативно, чтобы скомпилировать и выполнить пример самостоятельно, консультируйтесь, пример индексируют.Запускает пример ComboBoxDemo2

  2. Введите новый образец, выбирая один из меню поля комбинированного списка. Программа переформатировала текущую дату и время.
  3. Введите новый образец, вводя один, и нажатие Входят. Снова программа переформатировала текущую дату и время.

Следующий код, взятый от ComboBoxDemo2.java, создает и устанавливает поле комбинированного списка:

String[] patternExamples = {
         "dd MMMMM yyyy",
         "dd.MM.yy",
         "MM/dd/yy",
         "yyyy.MM.dd G 'at' hh:mm:ss z",
         "EEE, MMM d, ''yy",
         "h:mm a",
         "H:mm:ss:SSS",
         "K:mm a,z",
         "yyyy.MMMMM.dd GGG hh:mm aaa"
};
. . .
JComboBox patternList = new JComboBox(patternExamples);
patternList.setEditable(true);
patternList.addActionListener(this);

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

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

См. Интернационализацию, чтобы узнать больше о форматировании дат и других типов данных.

Обеспечение Пользовательского Средства рендеринга

Поле комбинированного списка использует средство рендеринга, чтобы вывести на экран каждый элемент в его меню. Если поле комбинированного списка недоступно для редактирования, оно также использует средство рендеринга, чтобы вывести на экран в настоящий момент выбранный пункт. Доступное для редактирования поле комбинированного списка, с другой стороны, использует редактора, чтобы вывести на экран выбранный пункт. Средство рендеринга для поля комбинированного списка должно реализовать ListCellRenderer интерфейс. Редактор поля комбинированного списка должен реализовать ComboBoxEditor. Этот раздел показывает, как обеспечить пользовательское средство рендеринга для недоступного для редактирования поля комбинированного списка.

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

Вот изображение приложения, которое использует поле комбинированного списка с пользовательским средством рендеринга:

Поле комбинированного списка с пользовательским средством рендеринга

Нажмите кнопку Launch, чтобы работать, Демонстрационный пример CustomComboBox, использующий Сеть Java™, Запускаются (загрузите JDK 6 или позже). Альтернативно, чтобы скомпилировать и выполнить пример самостоятельно, консультируйтесь, пример индексируют.

Запускает пример CustomComboBoxDemo

Полный исходный код для этого примера находится в CustomComboBoxDemo.java. Чтобы получить файлы изображений, это требует, консультируйтесь, пример индексируют.

Следующие операторы от примера создают экземпляр ComboBoxRenderer (пользовательский class) и установленный экземпляр как средство рендеринга поля комбинированного списка:

JComboBox petList = new JComboBox(intArray);
. . .
ComboBoxRenderer renderer = new ComboBoxRenderer();
renderer.setPreferredSize(new Dimension(200, 130));
petList.setRenderer(renderer);
petList.setMaximumRowCount(3);

Последняя строка устанавливает максимальное количество строки поля комбинированного списка, которое определяет число элементов, видимых, когда меню выводится на экран. Если число элементов в поле комбинированного списка больше чем его максимальное количество строки, у меню есть полоса прокрутки. Значки являются довольно большими для меню, таким образом, наш код ограничивает число строк к 3. Вот реализация ComboBoxRenderer, средство рендеринга, которое помещает значок и текст бок о бок:

class ComboBoxRenderer extends JLabel
                       implements ListCellRenderer {
    . . .
    public ComboBoxRenderer() {
        setOpaque(true);
        setHorizontalAlignment(CENTER);
        setVerticalAlignment(CENTER);
    }

    /*
     * This method finds the image and text corresponding
     * to the selected value and returns the label, set up
     * to display the text and image.
     */
    public Component getListCellRendererComponent(
                                       JList list,
                                       Object value,
                                       int index,
                                       boolean isSelected,
                                       boolean cellHasFocus) {
        //Get the selected index. (The index param isn't
        //always valid, so just use the value.)
        int selectedIndex = ((Integer)value).intValue();

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

        //Set the icon and text.  If icon was null, say so.
        ImageIcon icon = images[selectedIndex];
        String pet = petStrings[selectedIndex];
        setIcon(icon);
        if (icon != null) {
            setText(pet);
            setFont(list.getFont());
        } else {
            setUhOhText(pet + " (no image available)",
                        list.getFont());
        }

        return this;
    }
    . . .
}

Как a ListCellRenderer, ComboBoxRenderer реализует вызванный метод getListCellRendererComponent, который возвращает компонент чей paintComponent метод используется, чтобы вывести на экран поле комбинированного списка и каждый из его элементов. Самый легкий способ вывести на экран изображение и значок состоит в том, чтобы использовать метку. Так ComboBoxRenderer подкласс метки и возвращает себя. Реализация getListCellRendererComponent конфигурирует средство рендеринга, чтобы вывести на экран в настоящий момент выбранный значок и его описание.

К этим параметрам передают getListCellRendererComponent:

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

API Поля комбинированного списка

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

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

Установка или Получение Элементов в Комбинированном Меню Полей
Метод Цель
JComboBox ()
JComboBox (ComboBoxModel)
JComboBox (Объект [])
JComboBox (Вектор)
Создайте поле комбинированного списка с указанными элементами в его меню. У поля комбинированного списка, создаваемого с конструктором по умолчанию, нет никаких элементов в меню первоначально. Каждый из других конструкторов инициализирует меню от своего параметра: объект модели, массив объектов, или a Vector из объектов.
освободите addItem (Объект)
освободите insertItemAt (Объект, интервал)
Добавьте или вставьте указанный объект в меню поля комбинированного списка. Места метода вставки, которые указанный объект в указанном индексирует, таким образом вставляя это прежде, чем объект в настоящий момент в этом индексирует. Эти методы требуют, чтобы модель данных поля комбинированного списка была экземпляром MutableComboBoxModel.
Возразите getItemAt (интервал)
Возразите getSelectedItem ()
Получите элемент из меню поля комбинированного списка.
освободите removeAllItems ()
освободите removeItemAt (интервал)
освободите removeItem (Объект)
Удалите один или более элементов из меню поля комбинированного списка. Эти методы требуют, чтобы модель данных поля комбинированного списка была экземпляром MutableComboBoxModel.
интервал getItemCount () Получите число элементов в меню поля комбинированного списка.
освободите setModel (ComboBoxModel)
ComboBoxModel getModel ()
Набор или получает модель данных, которая обеспечивает элементы в меню поля комбинированного списка.
освободите setAction (Действие)
Действие getAction ()
Набор или добирается Action связанный с полем комбинированного списка. Для дополнительной информации см., Как Использовать Действия.
Настройка Работы Поля комбинированного списка
Метод или Конструктор Цель
освободите addActionListener (ActionListener) Добавьте слушателя действия поля комбинированного списка. Слушатель actionPerformed метод вызывают, когда пользователь выбирает элемент из меню поля комбинированного списка или в доступном для редактирования поле комбинированного списка, когда пользователь нажимает, Входят.
освободите addItemListener (ItemListener) Добавьте слушателя элемента поля комбинированного списка. Слушатель itemStateChanged метод вызывают, когда состояние выбора любого из элементов поля комбинированного списка изменяется.
освободите (булев) setEditable
булев isEditable ()
Набор или добирается, может ли пользователь ввести поле комбинированного списка.
освободите setRenderer (ListCellRenderer)
ListCellRenderer getRenderer ()
Набор или получает объект, ответственный за рисование выбранного пункта в поле комбинированного списка. Средство рендеринга используется только, когда поле комбинированного списка недоступно для редактирования. Если поле комбинированного списка доступно для редактирования, редактор используется, чтобы нарисовать выбранный пункт вместо этого.
освободите setEditor (ComboBoxEditor)
ComboBoxEditor getEditor ()
Набор или получает объект, ответственный за рисование и редактирование выбранного пункта в поле комбинированного списка. Редактор используется только, когда поле комбинированного списка доступно для редактирования. Если поле комбинированного списка недоступно для редактирования, средство рендеринга используется, чтобы нарисовать выбранный пункт вместо этого.

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

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

Пример Где Описано Примечания
ComboBoxDemo Этот раздел Использует недоступное для редактирования поле комбинированного списка.
ComboBoxDemo2 Этот раздел Использует доступное для редактирования поле комбинированного списка.
CustomComboBoxDemo Этот раздел Обеспечивает пользовательское средство рендеринга для поля комбинированного списка.
TableRenderDemo Как Использовать Таблицы (Используя Поле комбинированного списка как Редактор) Шоу, как использовать поле комбинированного списка в качестве табличного редактора ячейки.

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

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