Технология программирования. ЛР1. Новосибирский государственный технический университет
Скачать 243.28 Kb.
|
Министерство науки и высшего образования РФ НОВОСИБИРСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ Новосибирск 2021 Кафедра Вычислительной техники
Лабораторная работа 1 “Основы программирования на Java. Обработка событий. Механизм делегирования событий” по дисциплине “Технологии программирования” Цель работы Познакомиться с особенностями технологии Java и изучить синтаксис языка Java. Изучить основные понятия и термины обработки событий в модели делегирования событий на Java. Задание Вариант 11 Разработать абстрактный класс объекта, согласно варианту индивидуального задания. Создать интерфейс IBehaviour, задающий поведение объекта (методы: move(), getx(), gety(), sety(), setx() и другие. Далее будут реализоваться алгоритмы движения объектов в окне программы). Реализовать иерархию классов, определяющих объекты по варианту и реализующие интерфейс IBehaviour. Создать класс Habitat (среда), определяющий размер рабочей области и хранящий массив объектов, с параметрами, заданными вариантом. Предусмотреть в классе метод Update, вызывающийся по таймеру и получающий на вход время, прошедшее от начала симуляции. В данном методе должны генерироваться новые объекты и помещаться в поле визуализации в случайном месте. Визуализация объекта - использовать готовые небольшие картинки; Рабочее окно программы – область визуализации среды обитания объектов; Симуляция должна запускаться по клавише B и останавливаться по клавише E. При остановке симуляции список очищается. Время симуляции должно отображаться текстом в области визуализации и скрываться/показываться по клавише T; По завершению симуляции область отображения объектов очищается и в поле визуализации выводится информация о количестве и типе сгенерированных объектов, а также время симуляции. Текст должен быть форматирован, т.е. выводиться с использованием разных шрифтов и цветов. Параметры симуляции задаются в классе Habitat. Объекты – домашние животные. Бывают 2 видов: кошки и собаки. Кошки генерируются каждые N1 секунд с вероятностью P1. Собаки генерируются каждые N2 секунд с вероятностью P2. Демонстрация работы программы Рис. 1 – Процесс симуляции Рис. 2 – Подведение итогов симуляции Описание блоков программы class Main – основной класс, в котором определены поля и методы, отвечающие за отрисовку и вывод информации о симуляции. В нем определены такие переменные как boolean isTimeVisible – переменная хранит в себе логическое значение видимости метки текущего времени. Используется для того, чтобы добавлять и удалять метку текущего времени по нажатию клавиши T. AtomicLong timeSum – переменная, содержащая в себе значение времени, прошедшего с начала симуляции, используемая для обновления значения метки текущего времени. Был добавлен обработчик событий по нажатию клавиш B, E, T. Анонимный класс EventHandler динамически генерирует слушатели событий. class MyTimerTask является вложенным классом в основном классе, а также наследником TimerTask. Класс содержит в себе поля long time, Habitat window, int[] newPet. time передается в метод update(), чтобы выполнить проверку условия генерации объектов. window позволяет вызвать метод update(), принадлежащий классу Habitat. В классе переопределен метод run(), который реализует обновление рабочей области в отдельном потоке. interface IBehaviour – интерфейс, содержащий абстрактные методы move(), getx(), gety(), sety(), setx(). class Pet – абстрактный суперкласс, реализующий методы интерфейса IBehaviour. Содержит поля x и y, хранящие значение координат сгенерированного объекта. class Cat – класс-наследник класса Pet. class Dog – класс-наследник класса Pet. class Habitat – класс, отвечающий за рабочую среду программы. Содержит метод update(), реализующий обновление рабочей области и возвращающий целочисленный массив, состоящий из двух элементов. Элементы этого массива хранят в себе двоичное значение и отвечают за то, сгенерировался объект за одно выполнение метода update() или нет. Первый элемент отвечает за объект типа Cat, второй – за объект типа Dog. Кроме того, класс содержит в себе поля int N1, N2, P1, P2, где N1, N2 хранят в себе периоды генерации объектов, необходимые для выполнения условия внутри метода update(), а P1, P2 – вероятности генерации соответственно. int areaSizeX, areaSizeY содержат в себе размер области генерации. Используются для того, чтобы координаты объектов случайно генерировались в интервале рабочей области. Инициализируются путем передачи размеров фрейма в конструктор класса Habitat. Выводы В результате выполнения работы мы познакомились с базовыми типами Java, изучили основные понятия и термины в модели обработки событий, а также научились создавать пользовательский интерфейс программы. Приложение Листинг программы import javafx.application.Application; import javafx.application.Platform; import javafx.geometry.Insets; import javafx.scene.*; import javafx.scene.control.Label; import javafx.scene.image.*; import javafx.scene.image.Image; import javafx.scene.layout.*; import javafx.scene.paint.Color; import javafx.scene.text.Font; import javafx.stage.Stage; import javafx.event.EventHandler; import javafx.scene.input.KeyEvent; import java.io.*; import java.net.MalformedURLException; import java.util.Random; import java.util.Timer; import java.util.TimerTask; import java.util.concurrent.atomic.AtomicLong; public class Main extends Application { final int X = 1000; // размеры окна и области вывода изображений final int Y = 1000; int numberOfCats = 0; // переменные для записи статистики о родившихся животных int numberOfDogs = 0; boolean isTimeVisible = false; // видимость лейбла отсчета текущего времени @Override public void start(Stage stage) throws Exception{ stage.setTitle("Pet's area"); File fileIcon = new File("PetIcon.png"); // установка иконки приложения String localUrlIcon = fileIcon.toURI().toURL().toString(); stage.getIcons().add(new Image(localUrlIcon)); stage.setOnCloseRequest(e -> { // остановка программы по закрытии окна System.exit(0); }); StackPane root = new StackPane(); // контейнер, где хранятся изображения, фон и т.д. root.setBackground(new Background(new BackgroundFill(Color.rgb(220, 220, 220), CornerRadii.EMPTY, Insets.EMPTY))); Scene scene = new Scene(root, X, Y); // создаем окно Scene для вывода StackPane stage.setScene(scene); stage.show(); Habitat window = new Habitat(X, Y); // создание рабочей области AtomicLong timeSum = new AtomicLong(0); Label timeModule = new Label("Время: " + timeSum); timeModule.setFont(new Font("Times New Roman", 25)); StackPane.setMargin(timeModule, new Insets(0, X-200, Y-100, 0)); class MyTimerTask extends TimerTask { public long time; Habitat window; int[] newPet; MyTimerTask (Habitat window, long time){ this.window=window; this.time=time; } @Override public void run() { Platform.runLater(() -> { timeSum.set(timeSum.get() + 1); System.out.println("sec"); newPet = window.update(time); // обновление рабочей области, записываем КАКИЕ сгенерировались объекты ++time; try{ if (newPet[0] == 1){ File fileCat = new File("cat.png"); // установка изображений кошки и собаки String localUrlCat = fileCat.toURI().toURL().toString(); Image catImg = new Image(localUrlCat); ImageView ViewCat = new ImageView(catImg); StackPane.setMargin(ViewCat, new Insets(new Random().nextInt(Y), new Random().nextInt(X), new Random().nextInt(Y), new Random().nextInt(X))); // устанавливаем положение изображений root.getChildren().add(ViewCat); // добавляем в контейнер StackPane элемент с изображением животного stage.show(); numberOfCats++; } if (newPet[1] == 1){ File fileDog = new File("dog.png"); String localUrlDog = fileDog.toURI().toURL().toString(); Image dogImg = new Image(localUrlDog); ImageView ViewDog = new ImageView(dogImg); StackPane.setMargin(ViewDog, new Insets(new Random().nextInt(Y), new Random().nextInt(X), new Random().nextInt(Y), new Random().nextInt(X))); root.getChildren().add(ViewDog); stage.show(); numberOfDogs++; } } catch (MalformedURLException e) { throw new RuntimeException(e); } timeModule.setText("Время: " + (timeSum.get())); }); } } Timer timer = new Timer(); long time = 0; // засекаем время начала MyTimerTask updating = new MyTimerTask(window, time); scene.setOnKeyPressed(new EventHandler @Override public void handle(KeyEvent event) { switch (event.getCode()) { case B: timer.schedule(updating,0,1000); break; case E: timer.cancel(); // статистика на экране Label statistic = new Label("Время симуляции: " + timeSum + "\n Итого животных: " + (numberOfCats + numberOfDogs) + "\nКошек: " + numberOfCats + "\nСобак: " + numberOfDogs); statistic.setFont(new Font("Times New Roman", 20)); statistic.setTextFill(Color.web("#00717c")); root.getChildren().clear(); // очистка окна root.getChildren().add(statistic); break; case T: if (!isTimeVisible){ root.getChildren().add(timeModule); isTimeVisible = true; } else { root.getChildren().remove(timeModule); isTimeVisible = false; } break; } } }); } public static void main(String[] args) { launch(args); } } interface IBehaviour{ void move(); void setx(); void sety(); double getx(); double gety(); } abstract class Pet implements IBehaviour{ public double x, y; Pet(){} public void move(){}; public void setx(){}; public void sety(){}; public double getx(){return x;}; public double gety(){return y;}; } import java.util.Random; class Habitat { Pet[] array = new Pet[1000]; // массив объектов класса животные int N1 = 4, N2 = 3, // время генерации P1 = 70, P2 = 50; // вероятность генерации в % static int i = 0; private int areaSizeX, areaSizeY; // размер области генерации Habitat(int x, int y){ areaSizeX = x; areaSizeY = y; } int[] update(long time) { int[] newPet = {0, 0}; // 0,0 - никто, 0,1 - собака, 1,0 - кошка, 1,1 - кошка и собака if (new Random().nextInt(100) < P1 && time % N1 == 0) { // вероятность выполнения условия Cat kitty = new Cat(); array[i] = kitty; i++; System.out.println("cat has generated"); newPet[0] = 1; } if (new Random().nextInt(100) < P2 && time % N2 == 0) { // вероятность выполнения условия Dog puppy = new Dog(); array[i] = puppy; i++; System.out.println("dog has generated"); newPet[1] = 1; } return newPet; } } class Dog extends Pet{ Dog(){ } } class Cat extends Pet{ Cat(){ } } |