Введення в Swing

Зміст



Про цей посібник


Даний посібник призначено для новачків в Swing. Можливо, ви знайомі з тими, хто використовує цю технологію, або працюєте з додатками, написаними з її застосуванням. Може, ви навіть пробували її самостійно. У будь-якому випадку, це керівництво проведе вас через процес створення базового Swing-додатки, починаючи з всюдисущого програми HelloWorld. Після його запуску на вашій системі ми поглибимо ваші знання Swing, створивши систему резервування квитків і розвиваючи її до повністю функціонального застосування.


Під час роботи з даним керівництвом ви вивчіть всі початкові компоненти Swing; під початковими компонентами я розумію ті компоненти, використовуючи які можна створювати прості інтерфейси (UI). Ви дізнаєтеся, як використовувати базові методи для встановлення їх властивостей, і як ці Swing-компоненти взаємодіють з іншими компонентами. Ви також прочитаєте про інші UI-концепції, необхідних для повного знання Swing, включаючи схеми, події / Прослуховувач і моделі даних. До кінця керівництва ви повинні вміти створювати просте Swing-додаток.


Зверніть увагу, будь ласка, на те, що це керівництво не є всеосяжним підручником з Swing для початківців. Існують цілі книги, присвячені вивченню Swing, і я не можу тут дублювати їх вміст. Замість цього дане керівництво концентрується на найбільш широко використовуваних компонентах і функціях, з якими ви, як новачок, найімовірніше зіткнетеся під час своєї роботи.


Якщо після завершення роботи з цим керівництвом ви зацікавитесь подальшим вивченням Swing-програмування, ви повинні прочитати супутнє керівництво "Swing для середнього рівня", яке базується на концепціях і прикладі програми, розробленому тут.


Завантаження інструментальних засобів і вихідних кодів

Для роботи з даними керівництвом вам необхідно наступне програмне забезпечення:




Введення в UI


Перед початком вивчення Swing ви, як справжній новачок, маємо поставити питання, що таке UI? Відповідь для новачків – це "призначений для користувача інтерфейс". Але оскільки мета даного керівництва полягає в тому, щоб ви більше не були новачком, нам потрібно більш широке визначення, ніж це.


Отже, я знову ставлю запитання: що таке UI? Ви могли б визначити його як кнопки, на які натискаєте, поле адреси, в яке вводите інформацію, і вікна, які відкриваєте і закриваєте. Все це – елементи UI, але це не тільки речі, які ви бачите на екрані. Мишка, клавіатура, гучність музики, кольору екрана, використовувані шрифти і розташування об'єкта по відношенню до іншого об'єкта – все це теж становить UI. Взагалі кажучи, будь-який об'єкт, який бере участь у взаємодії користувача і комп'ютера, є частиною UI. Це здається таким простим, що ви, мабуть, здивуєтеся тому, як багато людей та корпорацій займаються цим роками. Дійсно, зараз є дисципліни в коледжах, повністю присвячені цьому взаємодії.


Роль Swing


Технологія Swing – це UI Java-платформи. Вона виступає як програмне забезпечення, що управляє всім взаємодією користувача і комп'ютера. По суті, вона служить посередником між користувачем і нутрощами комп'ютера. Як Swing робить це? Він надає механізми для управління аспектами UI, описаними в попередньому розділі:



У будь-якому випадку Swing надає вам всі інструменти, необхідні для створення вашого власного UI.


MVC


Swing йде навіть на крок далі і реалізує відомий шаблон проектування c основними принципами UI. Цей шаблон проектування називається Модель-Представлення-Контролер (Model-View-Controller – MVC) і прагне "розділити ролі". MVC зберігає код, відповідальний за зовнішній вигляд чого-небудь, окремо від коду, обробного дані, і окремо від коду, що реагує на взаємодію і виконує зміни.


Ви збентежені? Буде легше, якщо я вам наведу не технічний приклад цього шаблона проектування з реального світу. Уявіть показ мод. Вважайте, що це ваш UI і уявіть одяг даними, комп'ютерної інформацією, яку ви представляєте вашу користувачеві. Тепер уявіть, що цей показ мод складається тільки з однієї людини. Ця людина спроектував одяг, модифікував її і показав на подіумі. Це не виглядає добре продуманим або ефективним проектом.


Тепер уявіть собі цей же показ мод, який використовує шаблон проектування MVC. Замість однієї людини, яка робить все, ролі розділяються. Моделі для показу (природно, не плутайте з моделлю як акронімом MVC) представляють одяг. Вони виступають як подання. Вони знають, як правильно показати одяг (дані), але абсолютно не знають, як створювати або проектувати її. C іншого боку, дизайнер одягу працює за лаштунками, змінюючи її при необхідності. Дизайнер виступає в ролі контролера. Це людина не знає, як пройтися по подіуму, але може створювати і змінювати одяг. Дизайнер і моделі працюють з одягом незалежно один від одного і мають свою сферу компетенції.


Ця концепція лежить в основі шаблона проектування MVC: нехай кожен аспект UI має справу з тим, що він добре знає. Якщо ви все ще збентежені, приклади в частині керівництва, будемо сподіватися, пом'якшать це, але пам'ятайте про основний принцип: візуальні компоненти відображають дані, а інші класи управляють ними.


JComponent


Базовим будівельним блоком всієї бібліотеки візуальних компонентів Swing є JComponent. Це суперклас кожного компонента. Він є абстрактним класом, тому насправді ви не можете створити JComponent, Але він містить буквально сотні функцій, які кожен компонент Swing може використовувати як результат ієрархії класів. Очевидно, що деякі концепції більш важливі, ніж інші, але для цілей цього керівництва важливими є:




Прості Swing-віджети


JLabel


Самим основним компонентом у бібліотеці Swing є JLabel. Він робить саме те, чого ви від нього чекаєте: розташовується в потрібному місці, покращує вигляд програми і описує інші компоненти. На наведеному нижче зображенні показаний JLabel в дії:


JLabel


Крок 1: Розміщення компонентів


Як я вже казав, немає великої необхідності вивчати складні схеми, оскільки ви можете використовувати візуальний редактор.


Крок 2: Ініціалізація даних


Додаток не може працювати без даних. Давайте подумаємо про те, якого роду дані нам потрібні для цього додатка. По-перше, нам необхідний перелік міст для вибору міста відправлення і прибуття. Потім, нам необхідний список рейсів для пошуку.


Для цього прикладу я використовую фіктивні дані, тому що головне в додатку – це Swing, а не дані. Всі дані створюються в класі DataHandler. Цей клас управляє містами відправлення та прибуття, а також обробляє операції пошуку рейсів і вилучення записів.


Міста зберігаються в простих об'єктах String. Однак рейси зберігаються в об'єктах даних, званих Flights, Що містять поля для міста відправлення, міста прибуття, номера рейсу та кількості доступних квитків.


Тепер, з усіма цими червоними стрічками, що вказують шлях, давайте повернемося до додатка.


Крок 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, Не набагато більше прості. Я повернуся до розгляду TableModel в керівництві "Swing для середнього рівня"На додаток до іншої функціональності JTable.


Крок 5: Дзвінки і свистка


У будь-якому додатку користувачі очікують певну кількість дзвінків і свистків як додаткову функціональність, а також як спосіб запобігти виникненню помилок. У даному прикладі, хоча основна функціональність з пошуку рейсу та купівлі квитків працює, ви не розглядали можливі помилки, які можуть виникати. Для захисту від помилок ви повинні додати повідомлення про помилку при спробах користувача замовити більше квитків, ніж є. Як відобразити помилки? Якщо ви згадаєте розділ про компоненті JOptionPane, Swing має готовий компонент для такого роду негайної реакції.


Розглянемо умова помилки, а також те, що активізує повідомлення про помилку:






   try
{
DataHandler.updateRecords(o, tixx);
}
catch (Exception ex) {
/ / Показати тут повідомлення про помилку
}


Тепер подбаємо про повідомлення про помилку. Згадайте JOptionPane і його рясне кількість налаштувань. Виділимо налаштування, які хочемо мати в повідомленні про помилку, перед тим, як вирішимо, який тип JOptionPane створювати. Це має бути повідомлення про помилку, а не інформаційне повідомлення. Використовуйте простий заголовок, наприклад "Error". Детальне повідомлення складається з того, що видала виняткова ситуація. І, нарешті, помилка виникла з вини користувачів, тому має бути досить наявності кнопок OK і Cancel.


Ось код для створення такої JOptionPane:






<

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*


 JOptionPane.showConfirmDialog (this, ex.getMessage (), "Error",
JOptionPane.OK_CANCEL_OPTION, JOptionPane.ERROR_MESSAGE);