/************************************************** * Author: Morrison * Date: 09 Mar 2022 **************************************************/ import javafx.application.Application; import javafx.application.Platform; import javafx.stage.Stage; import javafx.scene.Scene; import javafx.scene.layout.BorderPane; import javafx.scene.layout.HBox; import javafx.scene.canvas.Canvas; import javafx.scene.canvas.GraphicsContext; import javafx.scene.paint.Color; import javafx.scene.control.Slider; import javafx.scene.control.Menu; import javafx.scene.control.MenuBar; import javafx.scene.control.MenuItem; import javafx.scene.control.ColorPicker; import javafx.scene.control.Label; import java.util.ArrayList; public class Draw extends Application { private Stage primary; private Color currentColor; private Color bgColor; private double currentSize; private Canvas canvas; private GraphicsContext pen; private Slider sizeSlider; private Label sizeLabel; private ShapeType currentShape; private ArrayList shapes; private HBox canvasBox; public Draw() { this.currentColor = Color.BLACK; this.currentShape = ShapeType.SQUARE; this.currentSize = 50; this.shapes = new ArrayList<>(); canvas = new Canvas(800, 500); pen = canvas.getGraphicsContext2D(); sizeSlider = new Slider(1, 200, 50); sizeSlider.valueProperty().addListener( (obs, old, newd) -> { currentSize = sizeSlider.getValue(); sizeLabel.setText("" + (int)(sizeSlider.getValue())); }); sizeLabel = new Label("50"); canvasBox = new HBox(); canvasBox.getChildren().add(canvas); } @Override public void init() { } @Override public void start(Stage primary) { this.primary = primary; BorderPane bp = new BorderPane(); HBox topBox = new HBox(); topBox.getChildren().add(buildMenus()); topBox.getChildren().add(sizeSlider); topBox.getChildren().add(sizeLabel); bp.setCenter(canvasBox); bp.setTop(topBox); primary.setScene(new Scene(bp)); pen.setFill(Color.RED); pen.fillRect(0,0,100,100); pen.setStroke(Color.BLUE); pen.strokeRect(200,200,50,50); pen.setFill(Color.GREEN); pen.fillOval(300,300, 100, 50); canvas.setOnMouseClicked( e -> { Shape s = null; switch(currentShape) { case SQUARE: s = new Square(e.getX(), e.getY(), currentSize, currentColor); break; case CIRCLE: s = new Circle(e.getX(), e.getY(), currentSize, currentColor); break; case TRIANGLE: s = new Triangle(e.getX(), e.getY(), currentSize, currentColor); break; } shapes.add(s); s.draw(pen); }); primary.show(); } private MenuBar buildMenus() { MenuBar mbar = new MenuBar(); Menu fileMenu = new Menu("File"); Menu saveAsMenu = new Menu("Save As..."); Menu colorMenu = new Menu("Color"); Menu sizeMenu = new Menu("Size"); Menu shapeMenu = new Menu("Shape"); Menu backgroundMenu = new Menu("Background"); mbar.getMenus().addAll(fileMenu, colorMenu, sizeMenu, shapeMenu, backgroundMenu); colorMenu.getItems().add(new ColorMenuItem("Red", Color.RED)); colorMenu.getItems().add(new ColorMenuItem("Blue", Color.BLUE)); colorMenu.getItems().add(new ColorMenuItem("Green", Color.GREEN)); colorMenu.getItems().add(new ColorMenuItem("Yellow", Color.YELLOW)); colorMenu.getItems().add(new ColorMenuItem("Dookbloo", Color.valueOf("#001A57"))); MenuItem customColorItem = new MenuItem("Custom..."); customColorItem.setOnAction( e -> { Stage popup = new Stage(); popup.setTitle("Chose your color!"); ColorPicker cp = new ColorPicker(); cp.setOnAction( event -> { currentColor = cp.getValue(); //popup.close(); }); BorderPane bp = new BorderPane(); bp.setCenter(cp); popup.setScene(new Scene(bp, 400, 400)); popup.show(); }); colorMenu.getItems().add(customColorItem); sizeMenu.getItems().add(new SizeMenuItem(20)); sizeMenu.getItems().add(new SizeMenuItem(50)); sizeMenu.getItems().add(new SizeMenuItem(100)); sizeMenu.getItems().add(new SizeMenuItem(200)); MenuItem quitItem = new MenuItem("Quit"); quitItem.setOnAction(e -> Platform.exit()); MenuItem clearItem = new MenuItem("Clear"); clearItem.setOnAction( e -> { shapes.clear(); pen.clearRect(0, 0, canvas.getWidth(), canvas.getHeight() ); }); fileMenu.getItems().addAll(clearItem, saveAsMenu, quitItem); shapeMenu.getItems().add(new ShapeMenuItem(ShapeType.SQUARE)); shapeMenu.getItems().add(new ShapeMenuItem(ShapeType.CIRCLE)); shapeMenu.getItems().add(new ShapeMenuItem(ShapeType.TRIANGLE)); backgroundMenu.getItems().add(new BgMenuItem("Black", Color.BLACK)); //populate the saveAs menu MenuItem jpgItem = new MenuItem("JPG"); jpgItem.setOnAction(e -> { FileChooser fc = new FileChooser(); fc.getExtensionFilter.add(new FileChooser.ExtensionFilter( "jpg file", "*.jpg)); File chosen = fc.showSaveDialog(null); if(chosen) { try { WritableImage wr = new WritableImage( 20 + (int)canvas.getWidth(), 20 + canvas.getHeight()); RenderedImage im = Swing.FXUtils.fromFXImage(wr, null); ImageIO.write(im, "png", chosen); } catch(IOException ex) { ex.printStackTrace(); } } } }); MenuItem pngItem = new MenuItem("PNG"); saveAsMenu.getItems().addAll(jpgItem, pngItem); return mbar; } @Override public void stop() { } /******************* Aliens ********************/ enum ShapeType { SQUARE, CIRCLE, TRIANGLE } class ColorMenuItem extends MenuItem { Color color; public ColorMenuItem(String name, Color color) { super(name); this.color = color; setOnAction( e -> { currentColor = color; }); } } class SizeMenuItem extends MenuItem { double size; public SizeMenuItem(double size) { super("" + size); this.size = size; setOnAction( e -> { currentSize = size; sizeSlider.setValue(currentSize); sizeLabel.setText("" + (int)currentSize); }); } } class ShapeMenuItem extends MenuItem { ShapeType shape; public ShapeMenuItem(ShapeType shape) { super("" + shape); this.shape = shape; setOnAction( e -> { currentShape = shape; }); } } class BgMenuItem extends MenuItem { Color color; public BgMenuItem(String name, Color color) { super(name); this.color = color; setOnAction( e -> { bgColor = color; /*pen.setFill(bgColor); pen.fillRect(0, 0, canvas.getWidth(), canvas.getHeight());*/ canvasBox.setStyle("-fx-background-color:" + bgColor.toString().substring(0, 8).replace("0x", "#")); }); } } }