Разрабатывается система автоматизированного проектирования. Базовым типом каждой для каждой детали или строительной конструкции является «форма», и каждая форма имеет цвет, размер, идентификатор и другие характеристики. Все наследуемые конкретные типы фигур - блок, кирпич, стена и прочие., могут иметь дополнительные характеристики и поведение. Их характеристики могут дополняться, а поведение может отличаться, например, формула вычисления площади поверхности каждой конкретной фигуры, ее отображение - различно. Иерархия типов воплощает в себе как сходства, так и различия между формами.
Варианты фигур:
круг, эллипс, прямоугольник, скругленный прямоугольник, квадрат (графический редактор):
стена, окно, крыльцо, крыша, забор ("рисуем домик");
блок ввод, решение, цикл, вывод (редактор блок-схем алгоритмов);
элементы И, ИЛИ, НЕ, ИЛИ-НЕ, И-НЕ (построитель цифровых схем).
1. Разработайте пользовательский интерфейс в соответствии с представленной расскадровкой
2. Создайте абстрактный суперкласс.
abstract class Shape {
//параметры фигуры - приватные поля
protected Color color;
protected double x, y;
// объявление абстрактных методов
abstract double area();
abstract void draw( GraphicsContext gr);
// конструктор
public Shape(Color color) {
System.out.println("Shape constructor called");
this.color = color; }
// реализация методов
public void setColor(Color color) {
this.color=color; }
}
3. Реализуйте конкретные классы для каждой фигуры:
class Rectangle extends Shape{
double length;
double width;
public Rectangle(Color color,double length,double width) {
// calling Shape constructor
super(color);
this.length = length;
this.width = width; }
@Override
double area() {
return length*width; }
@Override
public String toString() {
return "Rectangle color is " + super.color + "and area is : " + area(); }
}
4. Реализуйте обработчик для каждой кнопки графического интерфейса, выполняющий рисование соответствующей фигуры.
public void onClick(ActionEvent actionEvent) {
GraphicsContext graphicsContext = canvas.getGraphicsContext2D();
Rectangle rectangle=new Rectangle(colorpicker.getValue(), 100, 50);
rectangle.draw(graphicsContext);
System.out.println(rectangle.toString());
}
5*. Дополнительный функционал:
1) заливка фигуры и контура разными цветами;
2) изменение размера фигуры;
3) указание места для отображения фигуры;
4) рисование заданного кол-ва фигур;
5) вывод названия последней нарисованной фигуры;
гарантирует ,что поведение связанных классов одинаково.
Общая логика связанных классов определяется в суперклассе.
Варианты поведения, зависящие от конкретного наследника, размещаются в методах с одинаковой сигнатурой и эти методы абстрактные.
Abstract Superclass. Класс, выступающий в этой роли, представляет собой абстрактный суперкласс, в котором инкапсулирована общая логика связанных классов. Связанные классы расширяют этот класс. Таким образом, они могут наследовать его методы. Методы с одинаковыми сигнатурами и общей логикой для всех связанных классов помещаются в суперкласс, поэтому логика этих методов может наследоваться всеми подклассами данного суперкласса. Методы с зависящей от конкретного подкласса данного суперкласса логикой, но с одинаковыми сигнатурами, объявляются в абстрактном классе как абстрактные методы, тем самым гарантируя, что каждый конкретный подкласс будет иметь методы с такими же сигнатурами.
ConcreteClassl, ConcreteClass2 и т.д. Класс, выступающий в этой роли, представляет собой конкретный класс, чья логика и назначение связаны с другими конкретными классами. Методы, общие для этих связанных классов, помещаются в абстрактный суперкласс.
Рис. 1 - Шаблон Абстрактный суперкласс
Пакет javafx.scene.canvas JavaFX предоставляет API Canvas, который предлагает поверхность (холст) для рисования фигур, изображений и текста с помощью методов. API состоит только из двух классов:
• Canvas (холст);
• GraphicsContext (графический контент).
Canvas - это растровое изображение, которое используется в качестве поверхности для рисования. Экземпляр класса Canvas представляет холст, наследуемый от класса Node. Следовательно, Canvas - это узел сцены. Его можно добавить в граф сцены, и к нему можно применить эффекты и преобразования. Холст имеет графический контент (GraphicsContext) , связанный с ним, который используется в методах рисования на холсте.
Поэтому объект Canvas canvas
должен быть определен (прописан в fxml-форме или создан как объект Canvas canvas = new Canvas(400, 200););
добавлен к панели явно (root.getChildren().add(canvas);) или неявно (автоматически fxml скриптом);
Потом следует явно получить графический контент для рисования на нем:
GraphicsContext gc = canvas.getGraphicsContext2D();
И только получив GraphicsContext можно приступить к отрисовке конкретными методами, например
gc.strokeText("Hello Canvas", 150, 100);// написать текст
Все команды рисования предоставляются в классе GraphicsContext как методы. Рисунки, которые выходят за пределы Canvas обрезаются. Canvas использует буфер. Команды рисования передают необходимые параметры в этот буфер. Как только Canvas добавлен в граф сцены, графический контекст используется только в потоке приложений JavaFX.