Spec-Zone .ru
спецификации, руководства, описания, API
|
Прядильщики подобны полям комбинированного списка и спискам, в которых они позволяют пользователю выбирать из диапазона значений. Как доступные для редактирования поля комбинированного списка, прядильщики позволяют пользователю вводить значение. В отличие от полей комбинированного списка, у прядильщиков нет выпадающего списка, который может покрыть другие компоненты. Поскольку прядильщики не выводят на экран возможные значения — только текущая стоимость видима — они часто используются вместо полей комбинированного списка или списков, когда набор возможных значений является чрезвычайно большим. Однако, прядильщики должны только использоваться, когда возможные значения и их последовательность очевидны.
Прядильщик является составным компонентом с тремя субкомпонентами: две маленьких кнопки и редактор. Редактор может быть любым JComponent
, но по умолчанию это реализуется как панель, которая содержит отформатированное текстовое поле. Возможной и текущей стоимостью прядильщика управляет его модель.
Вот изображение названного приложения SpinnerDemo
у этого есть три прядильщика, используемые, чтобы определить даты:
Код для основного class может быть найден в SpinnerDemo.java
. Прядильщик Месяца выводит на экран имя первого месяца в локали пользователя. Возможные значения для этого прядильщика определяются, используя массив строк. Прядильщик Года выводит на экран одно значение диапазона целых чисел, инициализированных к текущему году. Другой прядильщик Даты выводит на экран одно значение в диапазоне Date
объекты (первоначально текущая дата) в пользовательском формате, который показывает только месяц и год.
Чтобы создать прядильщика, сначала создайте его модель и затем передайте модель в конструктора
String[] monthStrings = getMonthStrings(); //get month names SpinnerListModel monthModel = new SpinnerListModel(monthStrings); JSpinner spinner = new JSpinner(monthModel);
Остальная часть этого раздела затрагивает следующие темы:
API Swing обеспечивает три модели прядильщика:
SpinnerListModel
модель, значения которой определяются массивом объектов или a List
объект. Прядильщик Месяца в SpinnerDemo
пример использует эту модель, инициализированную с массивом, полученным из значения, возвращенного getMonths
метод java.text.DateFormatSymbols
class. См. SpinnerDemo.java
для деталей.SpinnerNumberModel
поддерживает последовательности чисел, которые могут быть выражены как double
объекты, int
объекты, или Number
объекты. Можно определить минимальные и максимальные допустимые значения, так же как размер шага — количество каждого инкремента или декремента. Прядильщик Года использует эту модель, создаваемую со следующим кодом: SpinnerModel model = new SpinnerNumberModel(currentYear, //initial value currentYear - 100, //min currentYear + 100, //max 1); //step
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.DefaultEditor
экземпляр с недоступным для редактирования отформатированным текстовым полем.
Чтобы изменить форматирование, используемое в стандартном редакторе прядильщика, можно создать и установить редактора самостоятельно.
JSpinner.NumberEditor
и JSpinner.DateEditor
у классов есть конструкторы, которые позволяют Вам создавать редактора, который форматирует его данные определенным способом. Например, следующие кодовые наборы Другой прядильщик Даты так, чтобы вместо того, чтобы использовать формат даты значения по умолчанию, который длинен и включает время, это показало только месяц и год компактным способом.
spinner.setEditor(new JSpinner.DateEditor(spinner, "MM/yyyy"));
Можно играть с форматами даты, работая ComboBoxDemo2
пример. Нажмите кнопку Launch, чтобы работать, 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, используя
Как мы упоминали прежде, если Вы реализуете модель прядильщика, которая не убывает от SpinnerListModel
, SpinnerNumberModel
, или SpinnerDateModel
, тогда редактор значения по умолчанию прядильщика является недоступным для редактирования экземпляром JSpinner.DefaultEditor
. Как Вы уже видели, можно установить редактора прядильщика, вызывая setEditor
метод на прядильщике после свойства модели прядильщика был установлен. Альтернатива использованию setEditor
должен создать подкласс JSpinner
class и переопределение createEditor
метод так, чтобы это возвратило определенный вид редактора всякий раз, когда модель прядильщика имеет определенный тип.
В теории, по крайней мере, можно использовать любого JComponent
экземпляр как редактор. Возможности включают использование подкласса стандартного компонента такой как JLabel
, или компонент Вы реализовали с нуля, или подкласс JSpinner.DefaultEditor
. Единственные требования - то, что редактор должен быть обновлен, чтобы отразить изменения в значении прядильщика, и у него должен быть разумный привилегированный размер. Редактор должен обычно также установить его текст подсказки в любой текст подсказки, был определен для прядильщика. Пример реализации редактора обеспечивается в следующем разделе.
Можно обнаружить, что значение прядильщика изменилось, регистрируя слушателя изменения или на прядильщике или на его модели. Вот пример реализации такого слушателя изменения. Этот пример от SpinnerDemo3
, который основан на SpinnerDemo
и использует слушателя изменения, чтобы изменить цвет некоторого текста, чтобы соответствовать значение Другого прядильщика Даты. Нажмите кнопку Launch, чтобы работать, 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, используя
...//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 FormattedTextField. Другие методы, которые Вы могли бы использовать, перечисляются в таблицах API в Классе JComponent.
Класс или Интерфейс | Цель |
---|---|
|
Однострочное поле ввода, которое позволяет пользователю выбирать число или объектное значение от упорядоченной последовательности. |
|
Интерфейс реализуется всеми моделями прядильщика. |
|
Обычный суперкласс для реализаций модели прядильщика. |
|
Подкласс AbstractSpinnerModel чьи значения определяются массивом или a List . |
|
Подкласс AbstractSpinnerModel это поддерживает последовательности Date экземпляры. |
|
Подкласс AbstractSpinnerModel это поддерживает последовательности чисел. |
|
Реализует недоступный для редактирования компонент, который выводит на экран значение прядильщика. Подклассы этого class обычно более специализируются (и доступные для редактирования). |
|
Подкласс JSpinner.DefaultEditor чьи значения определяются массивом или a List . |
|
Подкласс JSpinner.DefaultEditor это поддерживает последовательности Date экземпляры. |
|
Подкласс JSpinner.DefaultEditor это поддерживает последовательности чисел. |
Конструктор или Метод | Цель |
---|---|
|
Создает новое JSpinner . Конструктор без параметров создает прядильщика с целым числом SpinnerNumberModel с начальным значением 0 и никакие минимальные или максимальные пределы. Дополнительный параметр на втором конструкторе позволяет Вам определять свое собственное SpinnerModel . |
|
Наборы или получают в настоящий момент выведенный на экран элемент последовательности. |
|
Получает объект в последовательности, которая прибывает прежде или после объекта, возвращенного getValue метод. |
|
Получает или устанавливает модель прядильщика. |
|
Получает или устанавливает редактора прядильщика, который часто является объектом типа JSpinner.DefaultEditor . |
|
Вызванный JSpinner конструкторы, чтобы создать редактора прядильщика. Переопределите этот метод, чтобы связать редактора с определенным типом модели. |
Конструктор или Метод | Цель |
---|---|
|
Создает a JSpinner.NumberEditor экземпляр, который выводит на экран и позволяет редактировать значения числа указанного прядильщика. Строковый параметр определяет формат, чтобы использовать, чтобы вывести на экран число. См. документацию API для |
|
Создает a JSpinner.DateEditor экземпляр, который выводит на экран и позволяет редактировать Date значение указанного прядильщика. Строковый параметр определяет формат, чтобы использовать, чтобы вывести на экран дату. См. документацию API для |
(определенный в JSpinner.DefaultEditor ) |
Получает отформатированное текстовое поле, которое предоставляет основной GUI этому редактору. |
Метод | Цель |
---|---|
|
Наборы или добираются List это определяет последовательность для этой модели. |
Метод | Цель |
---|---|
|
Наборы или получают ток Date для этой последовательности. |
|
Наборы или получают первое Date в этой последовательности. Использовать null определить, что у прядильщика нет никакого более низкого предела. |
|
Наборы или получают последнее Date в этой последовательности. Использовать null определить, что у прядильщика нет никакого верхнего предела. |
|
Наборы или получают размер инкремента значения даты, используемого 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 . |
Метод | Цель |
---|---|
|
Наборы или получают текущую стоимость для этой последовательности. |
|
Наборы или получают верхнюю границу для чисел в этой последовательности. Если максимум null , нет никакой верхней границы. |
|
Наборы или получают нижнюю границу для чисел в этой последовательности. Если минимум null , нет никакой нижней границы. |
|
Наборы или использовали инкремент getNextValue и getPreviousValue методы. |
Эта таблица приводит примеры, которые используют прядильщиков и точки туда, где те примеры описываются.
Пример | Где Описано | Примечания |
---|---|---|
SpinnerDemo |
Этот раздел | Использование все три стандартных класса модели прядильщика. Содержит код, чтобы использовать пользовательскую модель прядильщика, но код выключается по умолчанию. |
SpinnerDemo2 |
Этот раздел | A SpinnerDemo подкласс, который использует пользовательскую модель прядильщика для ее прядильщика Месяцев. |
SpinnerDemo3 |
Этот раздел | Основанный на SpinnerDemo, это приложение показывает, как прислушаться к изменениям в значении прядильщика. |
SpinnerDemo4 |
Этот раздел | Реализует пользовательскую модель и пользовательского редактора для прядильщика, который выводит на экран оттенки серого. |