Выбрать главу

Вызов этого метода с отрицательным значением эквивалентно значению нуль.

Метод setLayoutOrientation определяет компоновку элементов списка.

Константа VERTICAL определяет расположение элементов вертикально в одном столбце.

Константа HORIZONTAL_WRAP определяет расположение элементов горизонтально, при необходимости с переносом их на новую строку.

Константа VERTICAL_WRAP определяет расположение элементов по вертикали, при необходимости с переносом их в новый столбец.

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

Методами setFixedCellHeight и setFixedCellWidth можно установить высоту и ширину отображаемых строк списка.

Так же, как и в раскрывающийся список JComboBox, в список JList можно добавлять не только текст, но и изображения.

По умолчанию в списке можно выбрать любое число любых элементов, держа нажатой клавишу <Ctrl>.

После применения метода setSelectionMode с константой SINGLE_SELECTION, в списке можно будет выбрать только один элемент.

Также, как и для раскрывающегося списка JComboBox, для списка JList, можно определить пользовательский объект ListCellRenderer, и отображать в списке любые компоненты, а не только строки и изображения.

Список генерирует события выбора списка при каждом изменении выбора.

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

Слушатель выбора списка должен реализовать один метод valueChanged.

Метод getValueIsAdjusting возвращает true, если пользователь все еще выбирает в списке.

Так как нам нужен только конечный результат действия пользователя, метод valueChanged делает что-либо, только если getValueIsAdjusting возвращает false.

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

Архитектура Model-View-Controller

Теперь, когда мы уже рассмотрели ряд Swing компонентов, давайте вернемся к архитектуре model-view-controller (MVC).

MVC – это общий подход к построению графических приложений.

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

Эта идея исходит из того, что мы хотели бы иметь более одного способа посмотреть на одни и те же данные.

Например, в большинстве приложений, разработанных для финансовых компаний, существуют разные экраны, которые позволяют просматривать один и тот же торговый процесс по-разному.

Еще один пример из реляционных баз данных.

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

Поэтому архитектура MVC предлагает нам строить графические интерфейсы с помощью моделей, видов и контроллеров.

Модель является источником данных, а вид – это Представление данных.

Модель ничего не знает вообще о Представлениях.

Однако, если Модель является динамичной, тогда она обеспечивает интерфейс прослушивания.

Таким образом, Представление является просто наблюдателем модели.

Когда данные в Модели меняются, она генерирует событие, отражающее изменение.

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

Хорошо, где Контроллер в этой картине?

Контролер отвечает за изменение модели.

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

Обычно Контроллер состоит из графической части и некоторой логики приложения.

Например, вы хотите добавить меню в свой редактор.

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

Теперь, добавляя меню, вы делаете его частью своего контроллера.

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

Контроллер – это способ, которым пользователь меняет модель.

Контроллер не обновляет Представление, потому что оно автоматически получает обновления, как наблюдатель модели.

полную версию книги