/************************************************** * Author: Morrison * Date: 03 Nov 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.paint.Color; import javafx.scene.layout.BorderPane; import javafx.scene.layout.HBox; import javafx.scene.control.Menu; import javafx.scene.control.MenuBar; import javafx.scene.control.MenuItem; import javafx.scene.control.Slider; import javafx.scene.control.Label; import javafx.scene.control.Button; import java.util.ArrayList; public class Draw extends Application { private final Canvas canvas; private final GraphicsContext pen; private Color bgColor; private Color currentColor; private ArrayList drawing; private Curve curve; private double mainWidth; public Draw() { canvas = new Canvas(800, 600); pen = canvas.getGraphicsContext2D(); bgColor = Color.WHITE; currentColor = Color.BLACK; drawing = new ArrayList(); mainWidth = 1; curve = null; } @Override public void init() { } @Override public void start(Stage primary) { primary.setTitle("Draw Application"); BorderPane bp = new BorderPane(); bp.setCenter(canvas); bp.setTop(buildMenus()); canvas.setOnMousePressed( e -> { curve = new Curve(currentColor, mainWidth); drawing.add(curve); curve.add(new Point(e.getX(), e.getY())); }); canvas.setOnMouseDragged( e -> { curve.add(new Point(e.getX(), e.getY())); curve.draw(pen); }); canvas.setOnMouseReleased( e -> { curve.add(new Point(e.getX(), e.getY())); curve.draw(pen); }); primary.setScene(new Scene(bp)); primary.show(); } private MenuBar buildMenus() { MenuBar mbar = new MenuBar(); Menu fileMenu = new Menu("File"); MenuItem quitItem = new MenuItem("Quit"); fileMenu.setOnAction(e -> Platform.exit()); fileMenu.getItems().addAll(quitItem); Menu colorMenu = new Menu("Color"); //populate this color menu. colorMenu.getItems().addAll( new ColorMenuItem(Color.RED, "red"), new ColorMenuItem(Color.GREEN, "green"), new ColorMenuItem(Color.rgb(0, 0x1A, 0x57), "Dook"), new ColorMenuItem(Color.BLUE, "blue") ); Menu bgMenu = new Menu("Background"); //create and populate width menu Menu widthMenu = new Menu("Width"); WidthMenuItem one = new WidthMenuItem(1); WidthMenuItem five = new WidthMenuItem(5); WidthMenuItem ten = new WidthMenuItem(10); WidthMenuItem twenty = new WidthMenuItem(20); WidthMenuItem fifty = new WidthMenuItem(50); MenuItem chooseItem = new MenuItem("Custom..."); widthMenu.getItems().addAll(one, five, ten, twenty, fifty, chooseItem); chooseItem.setOnAction( e -> { Stage popup = new Stage(); BorderPane p = new BorderPane(); HBox hbox = new HBox(); Button doneButton = new Button("Done"); Slider size = new Slider(1, 200, mainWidth); Label number = new Label("Width of Pen: " + mainWidth); size.valueProperty().addListener((observable, oldValue, newValue) -> { number.setText("Width of Pen: " + newValue.intValue()); mainWidth = newValue.intValue(); }); hbox.getChildren().addAll(number, size, doneButton); p.setTop(hbox); popup.setScene(new Scene(p, 300, 200)); popup.show(); doneButton.setOnAction(f -> popup.close()); }); mbar.getMenus().addAll(fileMenu, colorMenu, bgMenu, widthMenu); return mbar; } public void refresh() { //draw the background pen.setFill(bgColor); pen.fillRect(0, 0, canvas.getWidth(), canvas.getHeight()); ///redraw curves for( Curve c: drawing) { c.draw(pen); } // } public void serialize() { try { ObjectOutputStream oos = new ObjectOutputStream( new FileStream("draw.test")); oos. } } @Override public void stop() { } class ColorMenuItem extends MenuItem { private final Color color; public ColorMenuItem(Color color, String name) { super(name); this.color = color; setOnAction( e -> { currentColor = color; }); } } class WidthMenuItem extends MenuItem { private final double width; public WidthMenuItem(double width) { super("" + width); this.width = width; setOnAction( e -> { mainWidth = width; }); } } class BgMenuItem extends MenuItem { private final Color color; public BgMenuItem(Color color, String name) { super(name); this.color = color; setOnAction( e -> { bgColor = color; refresh(); }); } } }