- •Ide или текстовый редактор. Я рекомендую Eclipse (ссылки на дополнительную информацию по Eclipse можно найти в разделе Ресурсы).
- •Роль Swing
- •JComponent
- •JButton
- •JTextField
- •Is/setVisible(): Получить/установить видимость фрейма, другими словами, отображение на экране.
- •JPasswordField
- •JCheckBox/jRadioButton
- •JMenu/jMenuItem/jMenuBar
- •JSpinner
- •JToolBar
- •JToolTip
- •JOptionPane
- •JTextArea
- •JScrollPane
- •Простые схемы
- •События
- •Примеры модели
- •Шаг 3: Управление событиями
- •Шаг 4: Модели
- •Шаг 5: Звонки и свистки
- •Дальнейшие действия
- •Получить продукты и технологии
Шаг 3: Управление событиями
Исследуем приложение и рассмотрим действия, которые должны происходить. Во-первых, нужно знать, когда пользователь нажимает кнопку Search, для того чтобы можно было выполнить поиск рейсов. Во-вторых, вы должны знать, когда пользователь выбирает таблицу записей для предотвращения возможных ошибок при попытках пользователя купить билет на рейс тогда, когда не были выбраны записи в таблице. Наконец, необходимо знать, когда пользователь нажимает кнопку 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). Хотя есть некоторые важные моменты, помните о преимуществах использования моделей. И хотя у вас имеется только один класс модели, вы повторно используете его, создавая два экземпляра класса и предоставляя их каждому из 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); |
Из за большого объема кода, необходимого для создания TableModel, я не буду приводить его здесь, а перенаправлю вас к исходному коду примера приложения (ссылка для загрузки приведена в разделе «Ресурсы«) для более пристального исследования его работы. Кроме того, это только поверхностно затрагивает TableModel. Как я уже говорил ранее, JTable является самым сложным и трудным компонентом для работы со Swing, и его элементы, в том числе TableModel, не намного более просты.