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

Как Использовать Прядильщиков

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

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

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

SpinnerDemo показывает 3 вида прядильщиков

Код для основного class может быть найден в SpinnerDemo.java. Прядильщик Месяца выводит на экран имя первого месяца в локали пользователя. Возможные значения для этого прядильщика определяются, используя массив строк. Прядильщик Года выводит на экран одно значение диапазона целых чисел, инициализированных к текущему году. Другой прядильщик Даты выводит на экран одно значение в диапазоне Date объекты (первоначально текущая дата) в пользовательском формате, который показывает только месяц и год.


Попробуйте это: 
  1. Нажмите кнопку Launch, чтобы работать, SpinnerDemo, используя Сеть Java™ Запускаются (загрузите JDK 6 или позже). Альтернативно, чтобы скомпилировать и выполнить пример самостоятельно, консультируйтесь, пример индексируют.Запускает Приложение SpinnerDemo
  2. С прядильщиком Месяца используйте кнопки стрелки или ключи, чтобы циклически повториться вперед и назад через возможные значения.
    Отметьте, что самое низкое значение является первым месяцем года (например, январь), и самым высоким является последнее (например, декабрь). Точные значения зависят от Вашей локали. Также отметьте, что значения не циклически повторяются — невозможно использовать кнопку стрелки вверх или ключ, чтобы пойти с декабря непосредственно до января — потому что стандартные модели прядильщика не поддерживают циклическое повторение.
  3. Введите допустимое имя месяца для своей локали — например, июль.
    Отметьте, что прядильщик автоматически завершает имя месяца.
  4. Идя дальше прядильщику Года, попытайтесь ввести год более чем 100 лет назад — например, 1800 — и затем щелкните по другому прядильщику или нажмите клавишу Tab, чтобы переместить фокус из прядильщика.
    Поскольку эта программа ограничивает модель прядильщика числами в течение 100 лет после текущего года, 1800 недопустим. Когда перемещения фокуса из прядильщика, выведенный на экран текст возвращается к последнему допустимому значению.
  5. Перемещаясь к Другому прядильщику Даты, используйте кнопки стрелки или ключи, чтобы изменить дату.
    Отметьте, что по умолчанию первая часть даты — в этом случае, число месяца — изменяется. Можно измениться, какая часть даты изменяется или щелкая мышью или используя клавиши со стрелками, чтобы переместиться в другую часть даты.

Чтобы создать прядильщика, сначала создайте его модель и затем передайте модель в конструктора JSpinner. Например:

String[] monthStrings = getMonthStrings(); //get month names
SpinnerListModel monthModel = new SpinnerListModel(monthStrings);
JSpinner spinner = new JSpinner(monthModel);

Остальная часть этого раздела затрагивает следующие темы:

 

Используя Стандартные Модели Прядильщика и Редакторов

API Swing обеспечивает три модели прядильщика:

SpinnerListModel
SpinnerListModel модель, значения которой определяются массивом объектов или a List объект. Прядильщик Месяца в SpinnerDemo пример использует эту модель, инициализированную с массивом, полученным из значения, возвращенного getMonths метод java.text.DateFormatSymbols class. См. SpinnerDemo.java для деталей.
SpinnerNumberModel
SpinnerNumberModel поддерживает последовательности чисел, которые могут быть выражены как double объекты, int объекты, или Number объекты. Можно определить минимальные и максимальные допустимые значения, так же как размер шага — количество каждого инкремента или декремента. Прядильщик Года использует эту модель, создаваемую со следующим кодом:
SpinnerModel model =
        new SpinnerNumberModel(currentYear, //initial value
                               currentYear - 100, //min
                               currentYear + 100, //max
                               1);                //step
SpinnerDateModel
SpinnerDateModel поддерживает последовательности Date объекты. Можно определить минимальные и максимальные даты, так же как поле (такой как Calendar.YEAR) постепенно увеличиваться или постепенно уменьшаться. Отметьте, однако, что некоторые типы стили игнорируют указанное поле, и вместо этого изменяют поле, которое кажется выбранным. Другой прядильщик Даты использует эту модель, создаваемую со следующим кодом:
Date initDate = calendar.getTime();
calendar.add(Calendar.YEAR, -100);
Date earliestDate = calendar.getTime();
calendar.add(Calendar.YEAR, 200);
Date latestDate = calendar.getTime();
model = new SpinnerDateModel(initDate,
                             earliestDate,
                             latestDate,
                             Calendar.YEAR);

Когда Вы устанавливаете модель прядильщика, редактор прядильщика автоматически устанавливается. API Swing предоставляет редактору class, соответствующий каждому из трех упомянутых выше классов модели. Эти классы — JSpinner. ListEditor, JSpinner. NumberEditor, и JSpinner. DateEditor — являются всеми подклассами JSpinner. DefaultEditor class, что функция доступные для редактирования отформатированные текстовые поля. Если Вы используете модель, которой не связывали редактора с этим, редактор по умолчанию a JSpinner.DefaultEditor экземпляр с недоступным для редактирования отформатированным текстовым полем.

Определение Прядильщика, Форматирующего

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

JSpinner.NumberEditor и JSpinner.DateEditor у классов есть конструкторы, которые позволяют Вам создавать редактора, который форматирует его данные определенным способом. Например, следующие кодовые наборы Другой прядильщик Даты так, чтобы вместо того, чтобы использовать формат даты значения по умолчанию, который длинен и включает время, это показало только месяц и год компактным способом.

spinner.setEditor(new JSpinner.DateEditor(spinner, "MM/yyyy"));

Отметьте: 

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

Запускает Приложение ComboBoxDemo2

Для получения информации о строках формата см. урок Форматирования следа Интернационализации.


Чтобы изменить форматирование при использовании редактора значения по умолчанию, можно получить отформатированное текстовое поле редактора и вызвать методы на это. Можно вызвать те методы, используя getTextField метод, определенный в JSpinner.DefaultEditor class. Отметьте, что обеспеченные Swing редакторы не являются отформатированными текстовыми полями. Вместо этого они JPanel экземпляры, которые содержат отформатированное текстовое поле. Вот пример получения и вызова методов на отформатированном текстовом поле редактора:

//Tweak the spinner's formatted text field.
ftf = getTextField(spinner);
if (ftf != null ) {
    ftf.setColumns(8); //specify more width than we need
    ftf.setHorizontalAlignment(JTextField.RIGHT);
}
...

public JFormattedTextField getTextField(JSpinner spinner) {
    JComponent editor = spinner.getEditor();
    if (editor instanceof JSpinner.DefaultEditor) {
        return ((JSpinner.DefaultEditor)editor).getTextField();
    } else {
        System.err.println("Unexpected editor type: "
                           + spinner.getEditor().getClass()
                           + " isn't a descendant of DefaultEditor");
        return null;
    }
}

Создание Пользовательских Моделей Прядильщика и Редакторов

Если существующие модели прядильщика или редакторы не удовлетворяют Ваши потребности, можно создать свое собственное.

Самый легкий маршрут к созданию пользовательской модели прядильщика должен создать подкласс существующего AbstractSpinnerModel подкласс, который уже делает большинство того, в чем Вы нуждаетесь. Альтернатива должна реализовать Ваш собственный class, расширяясь AbstractSpinnerModel class, который реализует уведомления о событии, требуемые для всех моделей прядильщика.

Следующий подкласс SpinnerListModel реализует модель прядильщика что циклы через массив объектов. Это также позволяет Вам определять вторую модель прядильщика, которая будет обновлена всякий раз, когда цикл начинается снова. Например, если массив объектов является списком месяцев, соединенная модель могла бы быть для прядильщика, который выводит на экран год. Когда месяц переворачивает с декабря до января, год постепенно увеличивается. Точно так же, когда месяц зеркально отражает назад с января до декабря, год постепенно уменьшается.

public class CyclingSpinnerListModel extends SpinnerListModel {
    Object firstValue, lastValue;
    SpinnerModel linkedModel = null;

    public CyclingSpinnerListModel(Object[] values) {
        super(values);
        firstValue = values[0];
        lastValue = values[values.length - 1];
    }

    public void setLinkedModel(SpinnerModel linkedModel) {
        this.linkedModel = linkedModel;
    }

    public Object getNextValue() {
        Object value = super.getNextValue();
        if (value == null) {
            value = firstValue;
            if (linkedModel != null) {
                linkedModel.setValue(linkedModel.getNextValue());
            }
        }
        return value;
    }

    public Object getPreviousValue() {
        Object value = super.getPreviousValue();
        if (value == null) {
            value = lastValue;
            if (linkedModel != null) {
                linkedModel.setValue(linkedModel.getPreviousValue());
            }
        }
        return value;
    }
}

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

Запускает Приложение SpinnerDemo2

Как мы упоминали прежде, если Вы реализуете модель прядильщика, которая не убывает от SpinnerListModel, SpinnerNumberModel, или SpinnerDateModel, тогда редактор значения по умолчанию прядильщика является недоступным для редактирования экземпляром JSpinner.DefaultEditor. Как Вы уже видели, можно установить редактора прядильщика, вызывая setEditor метод на прядильщике после свойства модели прядильщика был установлен. Альтернатива использованию setEditor должен создать подкласс JSpinner class и переопределение createEditor метод так, чтобы это возвратило определенный вид редактора всякий раз, когда модель прядильщика имеет определенный тип.

В теории, по крайней мере, можно использовать любого JComponent экземпляр как редактор. Возможности включают использование подкласса стандартного компонента такой как JLabel, или компонент Вы реализовали с нуля, или подкласс JSpinner.DefaultEditor. Единственные требования - то, что редактор должен быть обновлен, чтобы отразить изменения в значении прядильщика, и у него должен быть разумный привилегированный размер. Редактор должен обычно также установить его текст подсказки в любой текст подсказки, был определен для прядильщика. Пример реализации редактора обеспечивается в следующем разделе.

Обнаружение Изменений Значения Прядильщика

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

Запускает Приложение SpinnerDemo3
public class SpinnerDemo3 extends JPanel
                          implements ChangeListener {
    protected Calendar calendar;
    protected JSpinner dateSpinner;
    ...
    public SpinnerDemo3() {
        ...
        SpinnerDateModel dateModel = ...;
        ...
        setSeasonalColor(dateModel.getDate()); //initialize color

        //Listen for changes on the date spinner.
        dateSpinner.addChangeListener(this);
        ...
    }

    public void stateChanged(ChangeEvent e) {
        SpinnerModel dateModel = dateSpinner.getModel();
        if (dateModel instanceof SpinnerDateModel) {
            setSeasonalColor(((SpinnerDateModel)dateModel).getDate());
        }
    }

    protected void setSeasonalColor(Date date) {
        calendar.setTime(date);
        int month = calendar.get(Calendar.MONTH);
        JFormattedTextField ftf = getTextField(dateSpinner);
        if (ftf == null) return;

        //Set the color to match northern hemisphere seasonal conventions.
        switch (month) {
            case 2:  //March
            case 3:  //April
            case 4:  //May
                     ftf.setForeground(SPRING_COLOR);
                     break;
            ...
            default: //December, January, February
                     ftf.setForeground(WINTER_COLOR);
        }
    }
    ...
}

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

Запускает Приложение SpinnerDemo4
...//Where the components are created:
JSpinner spinner = new JSpinner(new GrayModel(170));
spinner.setEditor(new GrayEditor(spinner));

class GrayModel extends SpinnerNumberModel {
    ...
}

class GrayEditor extends JLabel
                 implements ChangeListener {
    public GrayEditor(JSpinner spinner) {
        setOpaque(true);
        ...
        //Get info from the model.
        GrayModel myModel = (GrayModel)(spinner.getModel());
        setBackground(myModel.getColor());
        spinner.addChangeListener(this);
        ...
        updateToolTipText(spinner);
    }

    protected void updateToolTipText(JSpinner spinner) {
        String toolTipText = spinner.getToolTipText();
        if (toolTipText != null) {
            //JSpinner has tool tip text.  Use it.
            if (!toolTipText.equals(getToolTipText())) {
                setToolTipText(toolTipText);
            }
        } else {
            //Define our own tool tip text.
            GrayModel myModel = (GrayModel)(spinner.getModel());
            int rgb = myModel.getIntValue();
            setToolTipText("(" + rgb + "," + rgb + "," + rgb + ")");
        }
    }

    public void stateChanged(ChangeEvent e) {
            JSpinner mySpinner = (JSpinner)(e.getSource());
            GrayModel myModel = (GrayModel)(mySpinner.getModel());
            setBackground(myModel.getColor());
            updateToolTipText(mySpinner);
    }
}

API Прядильщика

Следующие таблицы приводят часть обычно используемого API для того, чтобы использовать прядильщиков. Если Вы должны иметь дело непосредственно с отформатированным текстовым полем редактора, следует также видеть API FormattedTextField. Другие методы, которые Вы могли бы использовать, перечисляются в таблицах API в Классе JComponent.

Классы, Связанные с Прядильщиками
Класс или Интерфейс Цель
JSpinner Однострочное поле ввода, которое позволяет пользователю выбирать число или объектное значение от упорядоченной последовательности.
SpinnerModel Интерфейс реализуется всеми моделями прядильщика.
AbstractSpinnerModel Обычный суперкласс для реализаций модели прядильщика.
SpinnerListModel Подкласс AbstractSpinnerModel чьи значения определяются массивом или a List.
SpinnerDateModel Подкласс AbstractSpinnerModel это поддерживает последовательности Date экземпляры.
SpinnerNumberModel Подкласс AbstractSpinnerModel это поддерживает последовательности чисел.
JSpinner. DefaultEditor Реализует недоступный для редактирования компонент, который выводит на экран значение прядильщика. Подклассы этого class обычно более специализируются (и доступные для редактирования).
JSpinner. ListEditor Подкласс JSpinner.DefaultEditor чьи значения определяются массивом или a List.
JSpinner. DateEditor Подкласс JSpinner.DefaultEditor это поддерживает последовательности Date экземпляры.
JSpinner. NumberEditor Подкласс JSpinner.DefaultEditor это поддерживает последовательности чисел.
Полезные Конструкторы JSpinner и Методы
Конструктор или Метод Цель
JSpinner ()
JSpinner (SpinnerModel)
Создает новое JSpinner. Конструктор без параметров создает прядильщика с целым числом SpinnerNumberModel с начальным значением 0 и никакие минимальные или максимальные пределы. Дополнительный параметр на втором конструкторе позволяет Вам определять свое собственное SpinnerModel.
освободите setValue (java.lang. Объект)
Возразите getValue ()
Наборы или получают в настоящий момент выведенный на экран элемент последовательности.
Возразите getNextValue ()
Возразите getPreviousValue ()
Получает объект в последовательности, которая прибывает прежде или после объекта, возвращенного getValue метод.
SpinnerModel getModel ()
освободите setModel (SpinnerModel)
Получает или устанавливает модель прядильщика.
JComponent getEditor ()
освободите setEditor (JComponent)
Получает или устанавливает редактора прядильщика, который часто является объектом типа JSpinner.DefaultEditor.
защищенный JComponent createEditor (SpinnerModel) Вызванный JSpinner конструкторы, чтобы создать редактора прядильщика. Переопределите этот метод, чтобы связать редактора с определенным типом модели.

 

Полезный Редактор Констракторс и Методы
Конструктор или Метод Цель
JSpinner. NumberEditor (JSpinner, Строка) Создает a JSpinner.NumberEditor экземпляр, который выводит на экран и позволяет редактировать значения числа указанного прядильщика. Строковый параметр определяет формат, чтобы использовать, чтобы вывести на экран число. См. документацию API для DecimalFormat для информации о десятичных строках формата.
JSpinner. DateEditor (JSpinner, Строка) Создает a JSpinner.DateEditor экземпляр, который выводит на экран и позволяет редактировать Date значение указанного прядильщика. Строковый параметр определяет формат, чтобы использовать, чтобы вывести на экран дату. См. документацию API для SimpleDateFormat для информации о строках формата даты.
JFormattedTextField getTextField ()
(определенный в JSpinner.DefaultEditor)
Получает отформатированное текстовое поле, которое предоставляет основной GUI этому редактору.
Методы SpinnerListModel
Метод Цель
освободите setList (Список)
Перечислите getList ()
Наборы или добираются List это определяет последовательность для этой модели.
Методы SpinnerDateModel
Метод Цель
освободите setValue (Объект)
Дата getDate ()
Возразите getValue ()
Наборы или получают ток Date для этой последовательности.
освободите (Сопоставимый) setStart
Сопоставимый getStart ()
Наборы или получают первое Date в этой последовательности. Использовать null определить, что у прядильщика нет никакого более низкого предела.
освободите (Сопоставимый) setEnd
Сопоставимый getEnd ()
Наборы или получают последнее Date в этой последовательности. Использовать null определить, что у прядильщика нет никакого верхнего предела.
освободите setCalendarField (интервал)
интервал getCalendarField ()
Наборы или получают размер инкремента значения даты, используемого getNextValue и getPreviousValue методы. Это свойство не используется, когда пользователь явно увеличивает или уменьшает значение; вместо этого, выбранная часть отформатированного текстового поля постепенно увеличивается или постепенно уменьшается. Указанный параметр должен быть одной из следующих констант, определенных в Calendar: ERA, YEAR, MONTH, WEEK_OF_YEAR, WEEK_OF_MONTH, DAY_OF_MONTH, DAY_OF_YEAR, DAY_OF_WEEK, DAY_OF_WEEK_IN_MONTH, AM_PM, HOUR_OF_DAY, MINUTE, SECOND, MILLISECOND.
Методы SpinnerNumberModel
Метод Цель
освободите setValue (Объект)
Число getNumber ()
Наборы или получают текущую стоимость для этой последовательности.
освободите (Сопоставимый) setMaximum
Сопоставимый getMaximum ()
Наборы или получают верхнюю границу для чисел в этой последовательности. Если максимум null, нет никакой верхней границы.
освободите (Сопоставимый) setMinimum
Сопоставимый getMinimum ()
Наборы или получают нижнюю границу для чисел в этой последовательности. Если минимум null, нет никакой нижней границы.
освободите setStepSize (Число)
Число getStepSize ()
Наборы или использовали инкремент getNextValue и getPreviousValue методы.

Примеры То Использование Прядильщики

Эта таблица приводит примеры, которые используют прядильщиков и точки туда, где те примеры описываются.

Пример Где Описано Примечания
SpinnerDemo Этот раздел Использование все три стандартных класса модели прядильщика. Содержит код, чтобы использовать пользовательскую модель прядильщика, но код выключается по умолчанию.
SpinnerDemo2 Этот раздел A SpinnerDemo подкласс, который использует пользовательскую модель прядильщика для ее прядильщика Месяцев.
SpinnerDemo3 Этот раздел Основанный на SpinnerDemo, это приложение показывает, как прислушаться к изменениям в значении прядильщика.
SpinnerDemo4 Этот раздел Реализует пользовательскую модель и пользовательского редактора для прядильщика, который выводит на экран оттенки серого.

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

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