Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import javax.swing.*;
- import javax.swing.border.LineBorder;
- import java.awt.*;
- import java.awt.event.MouseAdapter;
- import java.awt.event.MouseEvent;
- import java.awt.geom.Path2D;
- import java.awt.geom.Point2D;
- import java.util.function.Supplier;
- import java.util.stream.Stream;
- public class Main {
- public static void main(String[] args) {
- var frame = Factory.newFrame();
- var panels = Stream.generate(JPanel::new)
- .limit(9)
- .peek(p -> p.setLayout(new GridLayout(1, 1)))
- .peek(frame::add)
- .toArray(JPanel[]::new);
- var sheet = Factory.newSheet();
- var controller = Factory.addControllerSheet(sheet);
- controller.setFactoryDrawable(() -> new Brush(new BasicStroke(1, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER, 1.0f,
- new float[]{4f, 2f, 4f}, 0.0f), Color.BLACK));
- panels[4].setBorder(new LineBorder(Color.BLACK));
- panels[4].add(sheet);
- frame.setLayout(new GridLayout(3, 3));
- frame.setVisible(true);
- }
- }
- class Factory {
- public static DefaultSheetController addControllerSheet(Sheet sheet) {
- var controller = new DefaultSheetController(() -> new Brush(new BasicStroke(), Color.BLACK));
- sheet.addMouseMotionListener(controller);
- sheet.addMouseListener(controller);
- return controller;
- }
- public static JFrame newFrame() {
- JFrame frame = new JFrame("Test");
- frame.setSize(800, 600);
- frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
- return frame;
- }
- public static Sheet newSheet() {
- return new Sheet();
- }
- public static Graphics2D factoryGraphics2D(Graphics g) {
- Graphics2D g2d = (Graphics2D) g.create();
- g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
- //g2d.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE);
- return g2d;
- }
- }
- class DefaultSheetController extends MouseAdapter {
- private Drawable drawable;
- private Supplier<Drawable> factoryDrawable;
- DefaultSheetController(Supplier<Drawable> factoryDrawable) {
- this.factoryDrawable = factoryDrawable;
- }
- @Override
- public void mousePressed(MouseEvent e) {
- if (e.getComponent() instanceof Sheet sheet) {
- drawable = factoryDrawable.get();
- if (drawable.start(e.getPoint())) {
- sheet.add(drawable.getComponentDraw());
- sheet.revalidate();
- sheet.repaint();
- } else {
- drawable = null;
- }
- }
- }
- @Override
- public void mouseReleased(MouseEvent e) {
- if (drawable != null && e.getComponent() instanceof Sheet sheet) {
- drawable.end(e.getPoint());
- sheet.repaint();
- }
- }
- @Override
- public void mouseDragged(MouseEvent e) {
- if (drawable != null && e.getComponent() instanceof Sheet sheet) {
- drawable.update(e.getPoint());
- sheet.repaint();
- }
- }
- public void setFactoryDrawable(Supplier<Drawable> factoryDrawable) {
- this.factoryDrawable = factoryDrawable;
- }
- }
- interface Drawable {
- boolean start(Point2D p);
- boolean update(Point2D p);
- boolean end(Point2D p);
- JComponent getComponentDraw();
- }
- class Brush extends JComponent implements Drawable {
- private final Path2D path;
- private final Stroke stroke;
- private final Color color;
- private boolean isEnd;
- public Brush(Stroke stroke, Color color) {
- this.path = new Path2D.Double();
- this.stroke = stroke;
- this.color = color;
- isEnd = false;
- }
- @Override
- public boolean start(Point2D p) {
- if (isEnd) return false;
- path.moveTo(p.getX(), p.getY());
- return true;
- }
- @Override
- public boolean update(Point2D p) {
- if (isEnd) return false;
- path.lineTo(p.getX(), p.getY());
- return false;
- }
- @Override
- public boolean end(Point2D p) {
- isEnd = true;
- return true;
- }
- @Override
- public JComponent getComponentDraw() {
- return this;
- }
- @Override
- public void paint(Graphics g) {
- super.paint(g);
- var g2D = Factory.factoryGraphics2D(g);
- g2D.setColor(color);
- g2D.setStroke(stroke);
- g2D.draw(path);
- }
- }
- class Sheet extends JPanel {
- Sheet() {
- setLayout(new OverlayLayout(this));
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement