Advertisement
Guest User

Untitled

a guest
Nov 28th, 2023
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 4.63 KB | None | 0 0
  1. import javax.swing.*;
  2. import javax.swing.border.LineBorder;
  3. import java.awt.*;
  4. import java.awt.event.MouseAdapter;
  5. import java.awt.event.MouseEvent;
  6. import java.awt.geom.Path2D;
  7. import java.awt.geom.Point2D;
  8. import java.util.function.Supplier;
  9. import java.util.stream.Stream;
  10.  
  11. public class Main {
  12.     public static void main(String[] args) {
  13.         var frame = Factory.newFrame();
  14.         var panels = Stream.generate(JPanel::new)
  15.                 .limit(9)
  16.                 .peek(p -> p.setLayout(new GridLayout(1, 1)))
  17.                 .peek(frame::add)
  18.                 .toArray(JPanel[]::new);
  19.         var sheet = Factory.newSheet();
  20.         var controller = Factory.addControllerSheet(sheet);
  21.         controller.setFactoryDrawable(() -> new Brush(new BasicStroke(1, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER, 1.0f,
  22.                 new float[]{4f, 2f, 4f}, 0.0f), Color.BLACK));
  23.         panels[4].setBorder(new LineBorder(Color.BLACK));
  24.         panels[4].add(sheet);
  25.         frame.setLayout(new GridLayout(3, 3));
  26.         frame.setVisible(true);
  27.     }
  28. }
  29.  
  30. class Factory {
  31.     public static DefaultSheetController addControllerSheet(Sheet sheet) {
  32.         var controller = new DefaultSheetController(() -> new Brush(new BasicStroke(), Color.BLACK));
  33.         sheet.addMouseMotionListener(controller);
  34.         sheet.addMouseListener(controller);
  35.         return controller;
  36.     }
  37.  
  38.     public static JFrame newFrame() {
  39.         JFrame frame = new JFrame("Test");
  40.         frame.setSize(800, 600);
  41.         frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
  42.         return frame;
  43.     }
  44.  
  45.     public static Sheet newSheet() {
  46.         return new Sheet();
  47.     }
  48.  
  49.     public static Graphics2D factoryGraphics2D(Graphics g) {
  50.         Graphics2D g2d = (Graphics2D) g.create();
  51.         g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
  52.         //g2d.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE);
  53.         return g2d;
  54.     }
  55. }
  56.  
  57. class DefaultSheetController extends MouseAdapter {
  58.     private Drawable drawable;
  59.     private Supplier<Drawable> factoryDrawable;
  60.  
  61.     DefaultSheetController(Supplier<Drawable> factoryDrawable) {
  62.         this.factoryDrawable = factoryDrawable;
  63.     }
  64.  
  65.     @Override
  66.     public void mousePressed(MouseEvent e) {
  67.         if (e.getComponent() instanceof Sheet sheet) {
  68.             drawable = factoryDrawable.get();
  69.             if (drawable.start(e.getPoint())) {
  70.                 sheet.add(drawable.getComponentDraw());
  71.                 sheet.revalidate();
  72.                 sheet.repaint();
  73.             } else {
  74.                 drawable = null;
  75.             }
  76.         }
  77.     }
  78.  
  79.     @Override
  80.     public void mouseReleased(MouseEvent e) {
  81.         if (drawable != null && e.getComponent() instanceof Sheet sheet) {
  82.             drawable.end(e.getPoint());
  83.             sheet.repaint();
  84.         }
  85.     }
  86.  
  87.     @Override
  88.     public void mouseDragged(MouseEvent e) {
  89.         if (drawable != null && e.getComponent() instanceof Sheet sheet) {
  90.             drawable.update(e.getPoint());
  91.             sheet.repaint();
  92.         }
  93.     }
  94.  
  95.     public void setFactoryDrawable(Supplier<Drawable> factoryDrawable) {
  96.         this.factoryDrawable = factoryDrawable;
  97.     }
  98. }
  99.  
  100. interface Drawable {
  101.     boolean start(Point2D p);
  102.  
  103.     boolean update(Point2D p);
  104.  
  105.     boolean end(Point2D p);
  106.  
  107.     JComponent getComponentDraw();
  108. }
  109.  
  110. class Brush extends JComponent implements Drawable {
  111.     private final Path2D path;
  112.     private final Stroke stroke;
  113.     private final Color color;
  114.     private boolean isEnd;
  115.  
  116.     public Brush(Stroke stroke, Color color) {
  117.         this.path = new Path2D.Double();
  118.         this.stroke = stroke;
  119.         this.color = color;
  120.         isEnd = false;
  121.     }
  122.  
  123.     @Override
  124.     public boolean start(Point2D p) {
  125.         if (isEnd) return false;
  126.         path.moveTo(p.getX(), p.getY());
  127.         return true;
  128.     }
  129.  
  130.     @Override
  131.     public boolean update(Point2D p) {
  132.         if (isEnd) return false;
  133.         path.lineTo(p.getX(), p.getY());
  134.         return false;
  135.     }
  136.  
  137.     @Override
  138.     public boolean end(Point2D p) {
  139.         isEnd = true;
  140.         return true;
  141.     }
  142.  
  143.     @Override
  144.     public JComponent getComponentDraw() {
  145.         return this;
  146.     }
  147.  
  148.     @Override
  149.     public void paint(Graphics g) {
  150.         super.paint(g);
  151.         var g2D = Factory.factoryGraphics2D(g);
  152.         g2D.setColor(color);
  153.         g2D.setStroke(stroke);
  154.         g2D.draw(path);
  155.     }
  156. }
  157.  
  158. class Sheet extends JPanel {
  159.     Sheet() {
  160.         setLayout(new OverlayLayout(this));
  161.     }
  162. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement