Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ONAFT_CW_122_CPP_2020_Boitsova M.P._TP.pdf
Скачиваний:
38
Добавлен:
29.03.2021
Размер:
651.89 Кб
Скачать

Одеська національна академія харчових технологій

(повне найменування закладу вищої освіти)

Навчально-науковий інститут комп’ютерних систем і технологій «Індустрія 4.0» ім. П. М. Платонова,

Факультет комп’ютерної інженерії, програмування та кіберзахисту

(повне найменування інституту, назва факультету (відділення))

Кафедра інформаційних технологій та кібербезпеки

(повна назва кафедри (предметної, циклової комісії))

Пояснювальна записка

до курсової роботи бакалавра

з дисципліни Крос-платформне програмування на тему Зберігання даних, уведених користувачем, у файлі даних.

Клас «Розрахунок руху»

Студента 3 курсу 332 групи

спеціальності 122 Комп’ютерні науки ОПП «Комп’ютерні науки» Бойцової Марії Павлівни

(прізвище та ініціали)

Керівник ст. викладач кафедри ІТ та КБ Швець Н.В.

Оцінка: Національна шкала

Кількість балів

Члени комісії ____________ ___________________

(підпис) (прізвище та ініціали)

_______________ _________

(підпис) (прізвище та ініціали)

____________ ___________________

(підпис) (прізвище та ініціали)

м. Одеса – 2020 рік

Одеська національна академія харчових технологій Факультет інформаційних технологій та кібербезпеки Спеціальність комп’ютерні науки

ЗАВДАННЯ

НА КУРСОВУ РОБОТУ

1. Тема роботи

Зберігання даних, уведених користувачем, у файлі даних. Клас «Розрахунок руху»

2. Завдання за варіантом

Розробити додаток з графічним інтерфейсом, що здійснює запис, читання, пошук даних, заміну даних, уведених користувачем, у файл даних.

Варіант 2 Розрахунок руху

Найменування

Тип

Кількість

Наліт,

Пасажирооборот,

повітряної

літака

рейсів

тис. км

людино-км

лінії

 

 

 

 

 

 

 

 

 

 

ЗМІСТ

 

ВСТУП.....................................................................................................................

4

1

МЕТА РОБОТИ..................................................................................................

6

2

ПОСТАНОВКА ЗАДАЧІ..................................................................................

7

4

ОПИС ПРОГРАМНОГО ПРОДУКТУ ........................................................

21

6

ІНСТРУКЦІЯ З ЕКСПЛУАТАЦІЇ ПРОГРАМНОГО ПРОДУКТУ......

27

СПИСОК ВИКОРИСТАНИХ ДЖЕРЕЛ........................................................

29

ДОДАТОК А.........................................................................................................

30

Курсова робота Бойцової Марії Павлівни

4

ВСТУП

JAVA – це об’єктно-орієнтована, строго типізована мова програмування для створення програм, що виконують різні важливі і другорядні функції. Необхідно відзначити, що JAVA - це не тільки сама мова, але і платформа, на якійможливостворюватиівикористовуватидодатки,написанінаJAVA. Мова називалася розроблялася Джеймсом Гослінгом для програмування побутових електронних пристроїв. Згодом вона була перейменована в Java і стала використовуватися для написання клієнтських застосунків і серверного програмного забезпечення. У створенні мови програмування Java було п'ять початкових цілей:

Синтаксис мови повинен бути «простим, об'єктно-орієнтовним та звичним».

Реалізація має бути безвідмовною та безпечною.

Повинна зберегтися незалежність від архітектури та переносність.

Висока продуктивність виконання

Мова має бути інтерпретованою, багатопоточною, із динамічним

зв'язуванням модулів.

Особливої згадки вимагає така риса мови JAVA, як універсальність. Універсальність мови, як зазначає Гослінг, полягає в широті його застосування. Ви можете писати програми на JAVA для смарт-карт, для бортових комп’ютерів, для мережевих додатків великих організацій. І це тільки основні напрямки роботи за допомогою JAVA .

JavaFX – платформа на основі Java для створення прикладних програм із насиченим графічним інтерфейсом. Може бути використаний як для створення настільних прикладних програм, що запускаються безпосередньо з- під операційних систем, так і для інтернет-додатків (RIA), що працюють в

Курсова робота Бойцової Марії Павлівни

5

браузерах, і для прикладних програм на мобільних пристроях. JavaFX призначена замінити раніше використовувану бібліотеку Swing.

Цікавою особливістю є те, що вигляд та поведінку програм, написаних на JavaFX, можно налаштовувати за допомогою каскадних таблиць стилів (CSS – Cascading Style Sheets). Цей підхід, який історично був першим застосований для веб-сайтів, дозволяє відокремити зовнішній вигляд програм (інтерфейс користувача) від реалізації, що дозволяє програмістам концентруватись на кодуванні.

Переваги технології:

Код може посилатися на API з будь-яких бібліотек Java;

ВідокремленняCSS,щодозволяєвідокремитикодвідстилю

інтерфейсу;

Сумісність додатку з більшістю ОС;

Недоліки:

Не всі інтернет браузери підтримують JavaFX;

Після версії JDK 11 JavaFX потрібно завантажувати окремо як зовнішню бібліотеку;

JavaFX став частиною пакетів JRE / JDK разом з версією Java 8:

Підтримка 3D графіки.

Підтримка сенсорного введення.

Підтримка друку

Курсова робота Бойцової Марії Павлівни

6

1 МЕТА РОБОТИ

Створити крос-платформний додаток на мові програмування Java, який виконує наступні завдання:

Створює користувацький інтерфейс;

Реалізує роботу з файловою системою;

Реалізує роботу з методами та об’єктами класу;

Використовувати розширення JavaFX для придання насиченості та ергономічності інтерфейсу прикладної програми. Також важливою складовою в створенні інтерфейсу програми є його інтуїтивна зрозумілість та дружелюбність інтерфейсу.

Курсова робота Бойцової Марії Павлівни

7

2 ПОСТАНОВКА ЗАДАЧІ

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

Варіант 2 Розрахунок руху

Найменування

Тип

Кількість

Наліт,

Пасажирооборот,

повітряної

літака

рейсів

тис. км

людино-км

лінії

 

 

 

 

 

 

 

 

 

Прирозробціданоїпрограмибуливикористанінаступнібібліотекимови програмування Java:

a.javafx.scene.control.* – побудови вікна та робочої сцени, а саме: кнопок, міток, випадаючих списків, полів для вводу даних та текстового поля.

b.javafx.event.ActionEvent – для обробки подій кнопок та списку меню.

c.java.io.* - для роботи з файлами та для обробки виключень, пов’язаних із користувацьким введенням.

d.java.util.ArrayList – для використання колекції ArrayList в програмі.

e.javafx.scene.* - для побудови основної сцени.

f.javafx.stage.Stage – для побудови вікна програми.

g.javafx.application.Application – основний клас який є батьківським для javafx.

h.Javax.swing.ButtonGroup - для створення групи кнопок меню.

i.Javafx.geometry.Insets - для формування відступів для розташування елементів на сцені.

j.Javafx.geometry.HPos - для горизонтального позиціонування та вирівнювання.

Курсова робота Бойцової Марії Павлівни

8

3 ОПИС ЕТАПІВ РЕАЛІЗАЦІЇ

3.1 Створення інтерфейсу

Для створення інтерфейсу потрібно використати JavaFX, підключивши його засоби до проекту в IntellijIDEA (рис. 3.1).Для цього потрібно перейти на вкладку Файл -> Структура проекту -> Бібліотеки, та натиснути кнопку “+”. Даліпотрібновказатиповнийшляхдо бібліотеки уналаштуванняхJavaVirtual Machine у вкладці “Змінити конфігурації”.

Рисунок 3.1 – Підключення бібліотеки JavaFX до проекту в IntellijIDEA

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

Курсова робота Бойцової Марії Павлівни

9

буде підключено вкладки меню “Файл” та “Вигляд” (рис. 3.2). Вони, в свою чергу,будутьміститигрупикнопок,якідозволять подивитисьінформаціюпро виконавця, змінювати колір додатку та змінювати шрифт.

Рисунок 3.2 – контейнер з вкладками меню

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

Рисунок 3.3 – Область для введення даних користувачем

При створенні області програми для виводу інформації було використано TitledPale для надання цій області додаткової рамки та вже наявного заголовку, все це було виконано за для того, що б інтерфейс був

Курсова робота Бойцової Марії Павлівни

10

зрозумілим для користувача та формував окремий графічний блок програми. В цій області знаходяться кнопки для читання даних з файлу та виведення їх у TextArea, а також панель для пошуку (рис. 3.4).

Рисунок 3.4 – Область виведення даних

Також в попередній області програми створюється панель «Пошук» (рис. 3.5), в якій передбачений пошук обраного значення та редагування інформації у файлі даних. Особливість цієї панелі - можливість згорнути її, якщо на даний момент її функції не потрібні користувачеві. Такий підхід надає інтерфейсу програми більш простий вигляд і комфортність використання.

Курсова робота Бойцової Марії Павлівни

11

Рисунок 3.5 – Панель пошуку/редагування даних

3.2 Створення обробників подій

МоваJava підтримуєобробкуподій,якабазуєтьсянамоделіделегування подій. Принцип дії цієї моделі наступний: джерело події генерує подію та повідомляє про це одного зі слухачів. В цій моделі слухач просто очікує доти, доки не отримає повідомлення про подію. Слухачі подій повинні реєструватися джерелом, щоб отримувати подальші повідомлення про подію, та у кожного слухача є свій тип реєстрації. В проекті найчастіше використовувався метод setOnAction(), та в якості типу події вказувався тип ActionEvent. Таким чином, повідомлення надсилаються тільки тим слухачам, які повинні їх отримувати. Самі події можуть відбуватися не тільки при безпосередній взаємодії із користувацьким інтерфейсом. Наприклад, подія може відбутися при закінченні часу на таймері, завершення деякої операції та в інших випадках.

Подія типу ActionEvent генерується після натискання кнопки, натискання на елемент списку або вибору пункту меню. При цьому слід пам’ятати, що генерувати подію можуть тільки об’єкти класу MenuItem.

Курсова робота Бойцової Марії Павлівни

12

Обробники подій потрібні для виконання зазначеної дії в відповідь на подію на робочій області. Обробники подій у проекті:

Додавання у буфер обміну

addToBufButton.setOnAction((ActionEvent event) ->

{

MoveCount moveCount;

if (!windLineText.getText().isEmpty()&&!planeTypeText.getText().isEmpty()&&!race QuantityText.getText().isEmpty()&&!distanceText.getText().isEmpty()&&!passeng erKmText.getText().isEmpty())

{

try

{

String w_line=windLineText.getText().toUpperCase(); String plane_t=planeTypeText.getText().toUpperCase(); int

race_q=Integer.parseInt(raceQuantityText.getText().toUpperCase()); double

dist=Double.parseDouble(distanceText.getText().toUpperCase()); double

hum_km=Double.parseDouble(passengerKmText.getText().toUpperCase()); moveCount = new MoveCount(w_line, plane_t, race_q, dist,

hum_km);

addList.add(moveCount);

}

catch(Exception e)

{

System.out.println("Помилка! "+e.getMessage());

}

windLineText.clear();

planeTypeText.clear();

raceQuantityText.clear();

distanceText.clear();

passengerKmText.clear();

bufLabel.setText("Кількість строк у буфері: " + addList.size());

}

else

{

Alert alert=new Alert(Alert.AlertType.WARNING); DialogPane dialogPane=alert.getDialogPane();

Курсова робота Бойцової Марії Павлівни

13

dialogPane.setStyle("-fx-background-color: #e0e04c"); alert.setTitle("Помилка!"); alert.setHeaderText("Введіть усі дані!"); alert.setContentText(null);

alert.showAndWait();

}

});

Спочатку реєструється подія натискання на кнопку «Додати у буфер». Далі у тілі лямбда-виразу перевіряється, чи заповнені всі поля. Якщо хоча б одне залишилось порожнім, з’являється спливаюче вікно з повідомленням про помилку і рекомендацією заповнити всі поля. Якщо всі поля було заповнено, дані з них додаються у колекцію-буфер. Після додавання у колекцію поля для введення очищуються, кількість строк у буфері збільшується, повідомлення про це виводиться у метку «Кількість строк у буфері: *поточна кількість*». Дані у буфері зберігаються для подальшого додавання у файл.

Запис у файл

writeToFileButton.setOnAction((ActionEvent event)->{ if (addList.isEmpty() )

{

Alert alert=new Alert(Alert.AlertType.ERROR); DialogPane dialogPane=alert.getDialogPane(); dialogPane.setStyle("-fx-background-color: #FF6347"); alert.setTitle("Помилка!");

alert.setHeaderText("Щоб записати в файл, введіть дані!"); alert.setContentText(null);

alert.showAndWait();

}

else

{

try(PrintWriter out = new PrintWriter(new FileWriter("E:\\movecount.dat",true))){

Iterator<MoveCount> iterator = addList.iterator(); while(iterator.hasNext()){

Курсова робота Бойцової Марії Павлівни

14

MoveCount element; element = iterator.next(); element.writeData(out);

}

bufLabel.setText("Всі строки додано у файл"); addList.clear();

}

catch(IOException e)

{

e.printStackTrace();

}

}

});

Цей обробник подій перевіряє, чи пуста колекція-буфер, в яку додавав дані попередній обробник. Якщо вона пуста, з’являється спливаюче вікно з помилкою та попередженням, що дані не можуть бути записані у файл, оскільки вони відсутні. Якщо колекція-буфер заповнена, то дані записуються у файл по одній строчці. Одна строка відповідає одному екземпляру класу

MoveCount.

Читання з файлу

readFileButton.setOnAction((ActionEvent event) -> { textArea.clear();

readList.clear();

String s;

MoveCount obj;

File fl=new File("E:\\movecount.dat"); if(!fl.exists() || fl.length()==0)

{

Alert alert=new Alert(Alert.AlertType.ERROR); DialogPane dialogPane=alert.getDialogPane(); dialogPane.setStyle("-fx-background-color: darkgrey"); alert.setTitle("Помилка!");

Курсова робота Бойцової Марії Павлівни

15

alert.setHeaderText("Файл пустий або його не існує."); alert.setContentText(null);

alert.showAndWait();

}

else

{

try( BufferedReader in=new BufferedReader(new FileReader(fl)))

{

while( (s=in.readLine())!=null)

{

obj=new MoveCount(); obj.readData(s,in); readList.add(obj);

}

for(int i=0;i<readList.size();i++)

{

// textArea.appendText(readList.get(i)+"\n"); obj=new MoveCount();

obj= readList.get(i);

String text=String.format("Повітряна лінія: %s\nТип літака: %s\nКількість рейсів: %3d\nНаліт: %.0f\nПасажирообіг:%.0f\n",obj.getWindLine(),

obj.getPlaneType(), obj.getRaceQuantity(), obj.getDistance(), obj.getPassengerKm());

textArea.appendText(text+"\n");

}

}

catch(IOException exception)

{

exception.printStackTrace();

}

}

});

Курсова робота Бойцової Марії Павлівни

16

Для читання файлу спочатку перевіряється, чи пустий він та чи існує він взагалі. Якщо ні, з’являється спливаюче вікно із повідомленням про це. Якщо файл існує та в ньому є дані, то у колекцію-буфер зчитуються по одній строки. Якбулосказановище,однастрокавідповідаєодномуекземплярукласу,зяким працює програма. Після того, як було зчитано всі дані, вони виводяться у спеціально відведене текстове поле у відформатованому вигляді.

Пошук у файлі

searchButton.setOnAction((ActionEvent event) -> { textArea.clear();

indexOfFindList.clear(); boolean flag=false; MoveCount mc;

if(!searchText.getText().isEmpty()){ for(int i=0; i<readList.size(); i++){

mc = readList.get(i);

if(mc.getWindLine().equals(searchText.getText().toUpperCase())){ flag = true; textArea.appendText(mc+"\n"); indexOfFindList.add(i);

}

}

//for(int i=0; i<readList.size(); i++) //textArea.appendText(indexOfFindList.get(i)+"\n");

if(!flag){

Alert alert=new Alert(Alert.AlertType.ERROR); DialogPane dialogPane=alert.getDialogPane(); dialogPane.setStyle("-fx-background-color: #FFFFFF"); alert.setTitle("Помилка!"); alert.setHeaderText("Файл не знайдено!"); alert.setContentText(null);

alert.showAndWait();

}}

else{

Alert alert=new Alert(Alert.AlertType.ERROR); DialogPane dialogPane=alert.getDialogPane();

Курсова робота Бойцової Марії Павлівни

17

dialogPane.setStyle("-fx-background-color: #FFFFFF"); alert.setTitle("Помилка!"); alert.setHeaderText("Введіть дані для пошуку"); alert.setContentText(null);

alert.showAndWait();

}

});

Длявиконанняпошукууфайліочищуєтьсятекстовеполедлявиведення, щоб у подальшому вивести результат. Зчитується значення, введене користувачем, та порівнюється зі значеннями, які є у файлі. Якщо елемент знайдено, результат виводиться на екран, якщо ні – у спливаючому вікні виводиться повідомлення «Дані не знайдено».

Редагування даних

editButton.setOnAction((ActionEvent event) -> {

String m1 = "Повітряна лінія"; String m2 = "Тип літака"; String m3 = "Кількість рейсів"; String m4 = "Наліт";

String m5 = "Пасажирообіг";

MoveCount moveCount = null; if(indexOfFindList.isEmpty()){

Alert alert=new Alert(Alert.AlertType.ERROR); DialogPane dialogPane=alert.getDialogPane(); dialogPane.setStyle("-fx-background-color: #FFFFFF"); alert.setTitle("Помилка!"); alert.setHeaderText("Дані не знайдено."); alert.setContentText(null);

alert.showAndWait();

}

else{

if(choiceComboBox.getValue()==null || editText.getText().isEmpty()){

Alert alert=new Alert(Alert.AlertType.ERROR); DialogPane dialogPane=alert.getDialogPane();

Курсова робота Бойцової Марії Павлівни

18

dialogPane.setStyle("-fx-background-color: #FFFFFF"); alert.setTitle("Помилка!"); alert.setHeaderText("Дані не знайдено."); alert.setContentText(null);

alert.showAndWait();

}

else{

if(choiceComboBox.getValue().toString()== m1){ for(int i=0; i<indexOfFindList.size(); i++){

moveCount = readList.get(indexOfFindList.get(i));

moveCount.setWindLine(editText.getText().toUpperCase()); readList.set(indexOfFindList.get(i), moveCount);

}

}

if(choiceComboBox.getValue().toString()==m2){ for(int i=0; i<indexOfFindList.size(); i++){

moveCount = readList.get(indexOfFindList.get(i));

moveCount.setPlaneType(editText.getText().toUpperCase()); readList.set(indexOfFindList.get(i), moveCount);

}

}

if(choiceComboBox.getValue().toString()==m3){ for(int i=0; i<indexOfFindList.size(); i++){

moveCount = readList.get(indexOfFindList.get(i));

moveCount.setRaceQuantity(Integer.parseInt(editText.getText().toUpperCase()))

;

readList.set(indexOfFindList.get(i), moveCount);

}

}

if(choiceComboBox.getValue().toString()==m4){ for(int i=0; i<indexOfFindList.size(); i++){

moveCount = readList.get(indexOfFindList.get(i));

moveCount.setDistance(Integer.parseInt(editText.getText())); readList.set(indexOfFindList.get(i), moveCount);

}

}

if(choiceComboBox.getValue().toString()==m5){

Курсова робота Бойцової Марії Павлівни

19

for(int i=0; i<indexOfFindList.size(); i++){ moveCount = readList.get(indexOfFindList.get(i));

moveCount.setPassengerKm(Integer.parseInt(editText.getText())); readList.set(indexOfFindList.get(i), moveCount);

}

}

textArea.appendText("\nДані успішно замінено:\n"); textArea.appendText(moveCount+"\n");

try (PrintWriter out = new PrintWriter(new FileWriter("E:\\movecount.dat"))){

Iterator<MoveCount> it = readList.iterator(); while(it.hasNext()) {

MoveCount element; element=it.next(); element.writeData(out);

}

}

catch(IOException e)

{

e.printStackTrace();

}

readList.clear();

}

}

Найскладнішим обробником подій є редагування даних. Для редагування спочатку треба знайти у файлі той запис, який користувач хоче редагувати. Далі користувач обирає категорію, яку буде змінено. Після введення даних створюється новий файл, тобто він перезаписується і містить змінені дані, оскільки Java не підтримує безпосереднє редагування файлів, як, наприклад, С++. Колекція-буфер, в якій на момент редагування зберігались дані, очищується.

Варто звернути увагу на те, що всі дані, введені користувачем, переводяться до верхнього регістру. Такий підхід допомагає уникнути

Курсова робота Бойцової Марії Павлівни

20

помилок, які можуть відбутися. Наприклад, користувач ввів дані з маленької літери, а не з великої, як того вимагала програма.

Управляння кольором інтерфейсу

green.setOnAction((ActionEvent event ) -> { gridPane1.setStyle("-fx-background-color:darkgreen"); gridArray.setStyle("-fx-background-color:green"); searchGridPanel.setStyle("-fx-background-color:lightgreen");

windLineLabel.setStyle("-fx-text-fill: black"); planeTypeLabel.setStyle("-fx-text-fill: black"); raceQuantityLabel.setStyle("-fx-text-fill: black"); distanceLabel.setStyle("-fx-text-fill: black"); passengerKmLabel.setStyle("-fx-text-fill: black"); bufLabel.setStyle("-fx-text-fill: black");

});

Цей обробник подій змінює колір усіх компонувальників на зелений та колір міток на чорний за допомогою методів setStyle(). Цей метод може приймати в якості параметрів строки із вказанням, що змінювати та як змінювати.

Управління шрифтом інтерфейсу

Courier.setOnAction((ActionEvent event ) -> { searchButton.setFont(font2); editButton.setFont(font2); textArea.setFont(font2); textArea.setStyle("-fx-text-fill: #FFA500");});

Цей обробник подій змінює шрифт на один із передбачених розробником додатку. В даному випадку це шрифт Courier. Цей шрифт був обраний через те, що його підтримує більшість систем.