CubicCurveMouse.java Source code

Java tutorial

Introduction

Here is the source code for CubicCurveMouse.java

Source

import java.awt.BasicStroke;
import java.awt.BorderLayout;
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Container;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.geom.CubicCurve2D;
import java.awt.geom.Line2D;
import java.awt.geom.QuadCurve2D;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class CubicCurveMouse extends JFrame {
    DrawingCanvas canvas;

    JLabel label = new JLabel("Mouse Location (x, y):  ");
    JLabel coords = new JLabel("");

    public CubicCurveMouse() {
        super();
        Container container = getContentPane();

        JPanel panel = new JPanel();
        panel.setLayout(new GridLayout(1, 2));

        panel.add(label);
        panel.add(label);

        panel.add(coords);

        container.add(panel, BorderLayout.SOUTH);

        canvas = new DrawingCanvas();
        container.add(canvas);

        addWindowListener(new WindowEventHandler());
        setSize(300, 300);
        setVisible(true);
    }

    class WindowEventHandler extends WindowAdapter {
        public void windowClosing(WindowEvent e) {
            System.exit(0);
        }
    }

    public static void main(String arg[]) {
        new CubicCurveMouse();
    }

    class DrawingCanvas extends Canvas {
        float x1, y1, xc1cur, yc1cur, xc1new, yc1new, xc2cur, yc2cur, xc2new, yc2new, x4cur, y4cur, x4new, y4new;

        int pressNo = 0;

        int dragFlag1 = -1;

        int dragFlag2 = -1;

        boolean clearFlag = false;

        float dashes[] = { 5f, 5f };

        BasicStroke stroke;

        public DrawingCanvas() {
            setBackground(Color.white);
            addMouseListener(new MyMouseListener());
            addMouseMotionListener(new MyMouseListener());
            setSize(400, 400);
            stroke = new BasicStroke(1f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL, 10f, dashes, 0f);
        }

        public void update(Graphics g) {
            paint(g);
        }

        public void paint(Graphics g) {
            Graphics2D g2D = (Graphics2D) g;

            if (pressNo == 1) {
                g2D.setXORMode(getBackground());
                g2D.setColor(Color.black);
                g2D.setStroke(stroke);

                // Erase the currently existing line
                g2D.draw(new Line2D.Float(x1, y1, x4cur, y4cur));
                // Draw the new line
                g2D.draw(new Line2D.Float(x1, y1, x4new, y4new));

                // Update the currently existing coordinate values
                x4cur = x4new;
                y4cur = y4new;
            } else if (pressNo == 2) {
                g2D.setXORMode(getBackground());
                g2D.setColor(Color.black);
                g2D.setStroke(stroke);

                if (dragFlag1 != -1) {
                    g2D.draw(new QuadCurve2D.Float(x1, y1, xc1cur, yc1cur, x4new, y4new));
                }
                dragFlag1++; // Reset the drag-flag

                g2D.draw(new QuadCurve2D.Float(x1, y1, xc1new, yc1new, x4new, y4new));

                xc1cur = xc1new;
                yc1cur = yc1new;
            } else if (pressNo == 3) {
                g2D.setXORMode(getBackground());
                g2D.setColor(Color.black);

                if (dragFlag2 != -1) {
                    g2D.draw(new CubicCurve2D.Float(x1, y1, xc1new, yc1new, xc2cur, yc2cur, x4new, y4new));
                }
                dragFlag2++; // Reset the drag flag
                g2D.draw(new CubicCurve2D.Float(x1, y1, xc1new, yc1new, xc2new, yc2new, x4new, y4new));
                xc2cur = xc2new;
                yc2cur = yc2new;
            }
            if (clearFlag) {
                g2D.setXORMode(getBackground());
                g2D.setColor(Color.black);
                g2D.setStroke(stroke);

                g2D.draw(new Line2D.Float(x1, y1, x4new, y4new));
                g2D.draw(new QuadCurve2D.Float(x1, y1, xc1new, yc1new, x4new, y4new));
                clearFlag = false;
            }
        }

        class MyMouseListener extends MouseAdapter implements MouseMotionListener {
            public void mousePressed(MouseEvent e) {
                if (pressNo == 0) {
                    pressNo++;
                    x1 = x4cur = e.getX();
                    y1 = y4cur = e.getY();
                } else if (pressNo == 1) {
                    pressNo++;
                    xc1cur = e.getX();
                    yc1cur = e.getY();
                } else if (pressNo == 2) {
                    pressNo++;
                    xc2cur = e.getX();
                    yc2cur = e.getY();
                }
            }

            public void mouseReleased(MouseEvent e) {
                if (pressNo == 1) {
                    x4new = e.getX();
                    y4new = e.getY();
                    canvas.repaint();
                } else if (pressNo == 2) {
                    xc1new = e.getX();
                    yc1new = e.getY();
                    canvas.repaint();
                } else if (pressNo == 3) {
                    xc2new = e.getX();
                    yc2new = e.getY();
                    canvas.repaint();
                    pressNo = 0;
                    dragFlag1 = -1;
                    dragFlag2 = -1;
                    clearFlag = true;
                }
            }

            public void mouseDragged(MouseEvent e) {
                if (pressNo == 1) {
                    x4new = e.getX();
                    y4new = e.getY();
                    String string = "(" + Integer.toString(e.getX()) + ", " + Integer.toString(e.getY()) + ")";
                    coords.setText(string);
                    canvas.repaint();
                } else if (pressNo == 2) {
                    xc1new = e.getX();
                    yc1new = e.getY();

                    String string = "(" + Integer.toString(e.getX()) + ", " + Integer.toString(e.getY()) + ")";
                    coords.setText(string);
                    canvas.repaint();
                } else if (pressNo == 3) {
                    xc2new = e.getX();
                    yc2new = e.getY();
                    String string = "(" + Integer.toString(e.getX()) + ", " + Integer.toString(e.getY()) + ")";
                    coords.setText(string);
                    canvas.repaint();
                }
            }

            public void mouseMoved(MouseEvent e) {
                String string = "(" + Integer.toString(e.getX()) + ", " + Integer.toString(e.getY()) + ")";
                coords.setText(string);
            }
        }
    }
}