Создание собственных компонентов

Разглядим, как работает модель, на ординарном примере JComboBox. В материале об объекте класса JComboBox было показано, как добавлять элементы к данным, вызывая setItem(). Хотя это и приемлемо для обычных демонстраций, в реальных приложениях так делают редко. В конце концов, когда имеется 25 вариантов, и они повсевременно изменяются, неуж-то вы возжелаете проходить по Создание собственных компонентов ним в цикле, вызывая addItem() 25 раз? Конечно, нет.

JComboBox имеет способ setModel(), который воспринимает экземпляр класса ComboBoxModel. Вы должны использовать этот способ заместо способа addItem() для сотворения данных в JComboBox.

Представим, что имеется ArrayList с алфавитом в качестве данных («A», «B», «C» и т.д.):

MyComboModel Создание собственных компонентов model = new MyComboModel(alphaList);

myComboBox.setModel(model);

public class MyComboModel implements ComboBoxModel {

private List data = new ArrayList();

private int selected = 0;

public MyComboModel(List list) {

data = list;

}

public void setSelectedItem(Object o) {

selected = data.indexOf(o);

}

public Object getSelectedItem() {

return data.get(selected);

}

public int getSize() {

return data.size();

}

public Object getElementAt(int Создание собственных компонентов i) {

return data.get(i);

}

}

Неплохой стороной использования модели будет то, что вы сможете повторно использовать ее опять и опять. Представим, что данные в JComboBox должны быть изменены с букв алфавита на числа от 1 до 27. Вы сможете выполнить это изменение одной обычный строчкой, которая употребляет новый Создание собственных компонентов List данных для наполнения JComboBox без использования дополнительного кода:

myComboBox.setModel(new MyComboModel(numberList));

Модели являются полезными способностями Swing, так как они предоставляют возможность повторного использования кода и намного более просто работают с данными. Как это нередко случается в крупномасштабных приложениях, разработчики серверной части делают и извлекают данные и передают их Создание собственных компонентов UI-разработчикам. Обязанностью UI-разработчика является работать с данными и показывать их верно, а модели – инструменты, которые делают это.

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

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

Шаг 1: Размещение компонент

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

Шаг 2: Инициализация данных

Приложение не может работать без данных. Давайте подумаем о Создание собственных компонентов том, какого рода данные нам необходимы для данного приложения. Во-1-х, нам нужен перечень городов для выбора городка отправления и прибытия. Потом, нам нужен перечень рейсов для поиска.

Для этого примера употребляются фиктивные данные, так как главное в приложении — это Swing, а не данные. Все данные создаются в классе DataHandler. Этот Создание собственных компонентов класс управляет городками отправления и прибытия, также обрабатывает операции поиска рейсов и извлечения записей.

Городка сохраняются в обычных объектах String. Но рейсы хранятся в объектах данных, именуемых Flights, содержащих поля для городка отправления, городка прибытия, номера рейса и количества доступных билетов.

Шаг 3: Управление событиями

Исследуем приложение и разглядим Создание собственных компонентов деяния, которые должны происходить. Во-1-х, необходимо знать, когда юзер надавливает кнопку Search, для того чтоб можно было выполнить поиск рейсов. Во-2-х, вы должны знать, когда юзер выбирает таблицу записей для предотвращения вероятных ошибок при попытках юзера приобрести билет на рейс тогда, когда не были выбраны записи в таблице Создание собственных компонентов. В конце концов, следует знать, когда юзер надавливает кнопку Purchase для передачи избранных данных в класс обработчика данных.

Начнем с кнопки Search. Как говорилось выше, вы должны вызвать способ addActionListener() кнопки для регистрации на действия, возникающие при ее нажатии. Для простоты был применен класс FlightReservation для прослушивания всех вероятных событий Создание собственных компонентов. Вот код обработки нажатия кнопки Search:

String dest = getComboDest().getSelectedItem().toString();

String depart = getComboDepart().getSelectedItem().toString();

List l = DataHandler.searchRecords(depart, dest);

flightModel.updateData(l);

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

Потом исследуем, что происходит при нажатии юзером кнопки Purchase:

Object o = flightModel.getData().get(getTblFlights().getSelectedRow());

int tixx = Integer.parseInt(getTxtNumTixx().getText());

DataHandler.updateRecords(o, tixx);

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

В конце концов, вы должны проверить ошибки и убедиться в том, что никто не пробует приобрести билет, не выбрав рейса в таблице. Самый обычный метод сделать это — запретить составляющие Создание собственных компонентов, которые может использовать юзер для покупки билетов (текстовое поле и кнопку) и разрешать их только после выбора юзером строчки:

boolean selected = getTblFlights().getSelectedRow() > -1;

getLblNumTixx().setEnabled(selected);

getTxtNumTixx().setEnabled(selected);

getBtnPurchase().setEnabled(selected);

Шаг 4: Модели

Дальше разглядим модели, применяемые вами для обработки всех данных, передаваемых в обе стороны в этом Создание собственных компонентов приложении. Анализируя приложения и исследовав этот демо пример, вы должны верно узреть, что вам необходимы две модели: модель для JComboBoxes и модель для JTable.

Начнем с простейшей модели JComboBox. Хотя есть некие принципиальные моменты, помните о преимуществах использования моделей. И хотя у вас имеется только один класс модели, вы Создание собственных компонентов повторно используете его, создавая два экземпляра класса и предоставляя их каждому из JComboBox. Таким макаром, оба экземпляра могут обрабатывать свои собственные данные, хотя вы пишете только один класс для этого. Пример:

comboModel1 = new CityComboModel(DataHandler.getCities());

comboModel2 = new CityComboModel(DataHandler.getCities());

Перейдем к модели для JTable. Эта модель труднее, чем Создание собственных компонентов для JComboBox, и просит более пристального рассмотрения. Начнем с ваших познаний ComboBoxModel и поглядим, что необходимо добавить для JTable. Так как JTable содержит те же данные, что и ComboBox, но в нескольких столбцах, вам нужна более полная информация из модели. Другими словами, не считая познания количества Создание собственных компонентов строк данных вы должны знать количество столбцов, наименования столбцов и значение определенной ячейки, а не только лишь самого объекта. Это позволяет вам не только лишь показать объект данных, но также показать поля объекта данных. В данном примере мы не отображаем объект Flight; заместо этого мы отображаем поля: город отправления, город прибытия Создание собственных компонентов, номер рейса и количество доступных билетов. Ниже приведен код, применяемый для сотворения TableModel и для установки этой модели для JTable:

flightModel = new FlightTableModel();

getTblFlights().setModel(flightModel);

Шаг 5: Звонки и свистки

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

Разглядим условие ошибки, также то, что активизирует сообщение об ошибке:

try {

DataHandler.updateRecords(o, tixx);

} catch (Exception ex) {

// показать тут сообщение об ошибке

}

Сейчас нужно воплотить извещение об ошибке. Воспользуемся классом JOptionPane и его опциями. Выделим опции, которые желаем иметь Создание собственных компонентов в сообщении об ошибке, перед тем, как решим, какой тип JOptionPane создавать. Это должно быть сообщение об ошибке, а не информационное сообщение. Используйте обычной заголовок, к примеру «Error». Детализированное сообщение состоит из того, что выдала исключительная ситуация. И, в конце концов, ошибка появилась по вине юзеров, потому должно быть довольно наличия Создание собственных компонентов кнопок OK и Cancel.

Вот код для сотворения таковой JOptionPane:

JOptionPane.showConfirmDialog(this, ex.getMessage(), "Error",

JOptionPane.OK_CANCEL_OPTION, JOptionPane.ERROR_MESSAGE);

Направьте внимание на связи событие / слушатель – как взаимодействующие составляющие учавствуют во взаимоотношении событие / слушатель, другими словами на то, как заинтригованные стороны (в особенности другие составляющие) должны Создание собственных компонентов региться на эти действия.


sozdanie-strukturi-bazi-dannih-obekt-tablici.html
sozdanie-strukturi-tablic.html
sozdanie-svobodnoj-prostornoj-zhizni.html