/************************************************** * Author: Morrison * Date: 26 Oct 202020 **************************************************/ import javafx.application.Application; import javafx.application.Platform; import javafx.stage.Stage; import javafx.scene.Scene; import javafx.scene.canvas.Canvas; import javafx.scene.canvas.GraphicsContext; import javafx.scene.layout.BorderPane; import javafx.scene.control.Menu; import javafx.scene.control.MenuItem; import javafx.scene.control.MenuBar; import javafx.scene.control.ColorPicker; import javafx.scene.paint.Color; import java.util.ArrayList; public class Coordinated extends Application { private Stage primary; private Canvas canvas; private GraphicsContext pen; private Color currentColor; private Color bgColor; private ArrayList squares; private ArrayList redoBoneyard; public Coordinated() { canvas = new Canvas(800,600); pen = canvas.getGraphicsContext2D(); currentColor = Color.BLACK; squares = new ArrayList<>(); redoBoneyard = new ArrayList<>(); bgColor = Color.WHITE; } @Override public void init() { } @Override public void start(Stage primary) { this.primary = primary; BorderPane bp = new BorderPane(); bp.setCenter(canvas); bp.setTop(buildMenus()); canvas.setOnMouseClicked( e -> { Square s = new Square(currentColor, e.getX(), e.getY(), 100); squares.add(s); s.draw(pen); }); primary.setScene(new Scene(bp)); primary.show(); } private MenuBar buildMenus() { MenuBar mbar = new MenuBar(); Menu colorMenu = new Menu("Color"); Menu backgroundMenu = new Menu("Background"); Menu undoRedoMenu = new Menu("Undo/Redo"); MenuItem undoItem = new MenuItem("Undo"); MenuItem redoItem = new MenuItem("Redo"); undoRedoMenu.getItems().addAll(undoItem, redoItem); undoItem.setOnAction( e -> { if(!squares.isEmpty()) { redoBoneyard.add(squares.remove(squares.size() - 1)); refresh(); } }); redoItem.setOnAction( e -> { if(!redoBoneyard.isEmpty()) { squares.add(redoBoneyard.remove(redoBoneyard.size() - 1)); refresh(); } }); mbar.getMenus().addAll(undoRedoMenu, backgroundMenu, colorMenu); colorMenu.getItems().addAll( new ColorMenuItem(Color.RED, "red"), new ColorMenuItem(Color.BLUE, "blue"), new ColorMenuItem(Color.GREEN, "green"), new ColorMenuItem(Color.ORANGE, "orange") ); MenuItem customColor = new MenuItem("custom..."); colorMenu.getItems().add(customColor); customColor.setOnAction( e -> { ColorPicker cp = new ColorPicker(); cp.show(); currentColor = cp.getValue(); }); backgroundMenu.getItems().addAll( new BgMenuItem(Color.PINK, "pink"), new BgMenuItem(Color.LIGHTBLUE, "light blue"), new BgMenuItem(Color.WHITE, "white"), new BgMenuItem(Color.BLACK, "black") ); return mbar; } public void refresh() { pen.setFill(bgColor); pen.fillRect(0, 0, canvas.getWidth(), canvas.getHeight()); for(Square s: squares) { s.draw(pen); } } @Override public void stop() { } /********************** Aliens *************************/ class ColorMenuItem extends MenuItem { private final Color color; public ColorMenuItem(Color color, String name) { super(name); this.color = color; setOnAction( e -> { currentColor = color; }); } } class BgMenuItem extends MenuItem { private final Color color; public BgMenuItem(Color color, String name) { super(name); this.color = color; setOnAction( e -> { bgColor = color; refresh(); }); } } }