![]() |
Модераторы: LSD, AntonSaburov |
![]() ![]() ![]() |
|
AntonSaburov |
|
||||||||||
![]() Штурман ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5658 Регистрация: 2.7.2002 Где: Санкт-Петербург Репутация: 51 Всего: 118 |
Список - model и listeners. Пример попроще
Давайте рассмотрим постепенно все необходимые нам части пользовательского интерфейса. И начнем мы со списка групп. Здесь нас будет интересовать два момента: - Возможность реагировать на изменение выбранной строки в списке. Нам необходимо показывать список студентов выделенной группы. - Возможность добавить/удалить элемент списка. В нашем "отделе кадров" мы не ставили себе задачу редактировать именно список - студенты будут представлены в виде таблицы. Список будет содержать группы, и его мы не собирались редактировать. Но для понимания основ лучше будет пока рассмотреть именно список. Идеологически редактирование и представление данных в таблице будет очень похоже на работу со списком. Кроме списка мы коснемся работы с кнопками, которые нам тоже понадобятся в будущем. В данной части мы пока оставим наш "отдел кадров" в стороне, чтобы не было сразу сложно. Нам ведь предстоит немало потрудится. И если писать сразу весь код, то скорее всего Вы запутаетесь. Поэтому рассмотрим все на тестовом примере - создадим простую форму и положим на нее всего лишь один объект - список. В SWING для этого существует специальный класс - JList. Позже добавим еще пару кнопок и панель. Наше самое простое приложение будет выглядеть вот так:
Вообщем ничего сложного пока нет. Давайте теперь добавим в наш список возможность реагировать на события - а именно на перемещение указателя. Теперь мы вплотную подошли в слушателям (listeners). По сути они и являются теми самыми контроллерами в паттерне MVC) Model-View-Controller). Если Вы внимательно читали первую часть посвященную SWING, то помните, что механизм листенеров (автор приносит свои извинения за русский вариант английского слова, но в программистской среде понятие "слушатель" встречается крайне редко) основан на простой идее - объект, который принимает какие-либо события может содержать список объектов, которые "подписались" на "прослушку" событий. Т.е. для примера - кнопка при своем нажатии проверяет список листенеров и каждому посылает сообщение, что ее нажали. Предварительно каждый, кто хочет знать о нажатии добавляет себя в список листенеров для кнопки. Чтобы принять сообщение от кнопки листенер должен реализовать интерфейс. Давайте посмотрим это на примере. Для списка листенер должен реализовать интерфейс ListSelectionListener. В нашем случае листенером будет сама форма. Также мы сразу введем режим выделения для списка - только одна строка. Список может выделять несколько пунктов сразу, но нас этот режим не интересует. Кто хочет рассмотреть подробно - читайте документацию.
Теперь если мы запустим наше приложение из командной строки, то при перемещении увидим на экране строку с номером индекса. Но если Вы попробуете изменять строки мышкой, то заметите, что наш метод valueChanged вызывается ДВА раза. Это связано с тем, что список может выделять сразу много строк. В нашем случае нам этот эффект ольше мешает, чем помогает. Но мы можем найти на него управу - оказывается объект класса ListSelectionEvent имеет метод getValueIsAdjusting который возвращает true если событие вызывается по причине выбора нескольких пунктов. Нам интересен момент, когда этот метод возвращает false - нам же не надо отслеживать многострочные выделения внутри нашего списка. Поэтому наш пример немного изменится.
Теперь давайте попробуем изменять наш список динамически. Если вы будете пробовать просто добавлять в наш вектор какие-либо значения, то эффекта на экране вы не увидите. Вернее может и увидите, но что там точно будет гарантировать я не могу. Как уже упоминалось, нам надо действовать через модель. Модель можно получить вызовом JList.getModel(). Этот метод возвращает нам не класс, а интерфейс ListModel. Конечно же за ним кроется какой-то настоящий класс, но в том удобство и состоит, что Вы можете написать свою модель, которая обязана реализовать интерфейс ListModel по своему вкусу, и расширить его теми функциями, которые Вам необходимы. Давайте напишем пример, который будет добавлять в наш список строки. Предварительно сделаем вот какое замечание - наш список на самом деле уже имеет некоторую модель. Но она не является стандартной и что она умеет точно - мы не знаем. В пакете SWING есть уже готовая модель, которая умеет то, что нам надо - а именно добавлять строки. Это DefaultListModel. Давайте ее и используем. Кроме этого мы добавим кнопку, которая будет давать команду на добавление. Для "прослушивания" событий от кнопки нам надо реализовать интерфейс ActionListener. В нем тоже всего один метод - actionPerformed.
И наконец напишем пример, которы не только добавляет, но и удаляет. Для этого добавим еще одну кнопку. Заметьте, что обработчик для обеих кнопок будет один и тот же. Для того, чтобы узнать какая кнопка нажата будем использовать методы getName/setName. В примере есть одно неудобство - Вам надо каждый раз при удалении выделять какую строку вы хотите удалить. Но решение этой проблемки автор оставляет для читателя.
Теперь Вы готовы к более сложным испытаниям, а именно к работе с наши отделом кадров. В следующей части мы с вами создадим более интересный интерфейс, чем тот, который был ранее. Мы будем делать это постепенно - вводить листенеры, реализовывать команды. Итак смотрим Часть 5 - Улучшаем интерфейс и вводим команды |
||||||||||
|
|||||||||||
![]() ![]() ![]() |
Правила форума "Java" | |
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Java: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |