Java: mouseDragged and moving around in a graphical interface

30,295

Based on this example, the following program allows the user to drag the axes' intersection to an arbitrary point, origin, which starts at the center of the panel.

iamge

import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import javax.swing.JFrame;
import javax.swing.JPanel;

/**
 * @see https://stackoverflow.com/a/15576413/230513
 * @see https://stackoverflow.com/a/5312702/230513
 */
public class MouseDragTest extends JPanel {

    private static final String TITLE = "Drag me!";
    private static final int W = 640;
    private static final int H = 480;
    private Point origin = new Point(W / 2, H / 2);
    private Point mousePt;

    public MouseDragTest() {
        this.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
        this.addMouseListener(new MouseAdapter() {
            @Override
            public void mousePressed(MouseEvent e) {
                mousePt = e.getPoint();
                repaint();
            }
        });
        this.addMouseMotionListener(new MouseMotionAdapter() {
            @Override
            public void mouseDragged(MouseEvent e) {
                int dx = e.getX() - mousePt.x;
                int dy = e.getY() - mousePt.y;
                origin.setLocation(origin.x + dx, origin.y + dy);
                mousePt = e.getPoint();
                repaint();
            }
        });
    }

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(W, H);
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawLine(0, origin.y, getWidth(), origin.y);
        g.drawLine(origin.x, 0, origin.x, getHeight());
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame f = new JFrame(TITLE);
                f.add(new MouseDragTest());
                f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                f.pack();
                f.setLocationRelativeTo(null);
                f.setVisible(true);
            }
        });
    }
}
Share:
30,295
Matti
Author by

Matti

Updated on July 09, 2022

Comments

  • Matti
    Matti almost 2 years

    newbie programmer here.

    I'm making a program that renders user-inputted equations in a Cartesian coordinate system. At the moment I'm having some issues with letting the user move the view around freely in the coordinate. Currently with mouseDragged the user can drag the view around a bit, but once the user releases the mouse and tries to move the view again the origin snaps back to the current position of the mouse cursor. What is the best way to let the user move around freely? Thanks in advance!

    Here's the code for the drawing area.

    import java.awt.Color;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.Point;
    import java.awt.Rectangle;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseListener;
    import java.awt.event.MouseMotionListener;
    import java.awt.geom.Line2D;
    import java.awt.geom.Point2D;
    import javax.swing.JPanel;
    public class DrawingArea extends JPanel implements MouseMotionListener {
    
    private final int x_panel = 350; // width of the panel
    private final int y_panel = 400; // height of the panel
    private int div_x; // width of one square
    private int div_y; // height of one square
    
    private int real_y;
    private int real_x;
    private Point origin; // the origin of the coordinate
    private Point temp; // temporary point
    
    private static int y = 0;
    private static int x = 0;
    
    DrawingArea() {
        setBackground(Color.WHITE);
    
        real_x = x_panel;
        real_y = y_panel;
    
        setDivisionDefault();
        setOrigin(new Point((real_x / 2), (real_y / 2)));
    
        setSize(x_panel, y_panel);
        addMouseMotionListener(this);
    
    }
    
    DrawingArea(Point origin, Point destination) {
         this.origin = origin;
         this.destination = destination;
         panel = new JPanel();
         panel.setSize(destination.x, destination.y);
         panel.setLocation(origin);
         this.panel.setBackground(Color.red);
         panel.setLayout(null);
    
    
    }
    
    @Override
    public void paintComponent(Graphics g) {
    
        super.paintComponent(g);
    
        Graphics2D line = (Graphics2D) g;
    
    
        temp = new Point(origin.x, origin.y);
    
        line.setColor(Color.red);
        drawHelpLines(line);
    
        line.setColor(Color.blue);
        drawOrigin(line);
    
        line.setColor(Color.green);
        for (int i = 0; i < 100; i++) { // This is a test line
            //temp = this.suora();
    
            temp.x++;
            temp.y++;
    
            line.drawLine(temp.x, temp.y, temp.x, temp.y);
    
        }
    
    
    
    }
    
    public void setOrigin(Point p) {
        origin = p;
    
    
    }
    
    
    
    public void drawOrigin(Graphics2D line) {
        line.drawLine(origin.x, 0, origin.x, y_panel);
        line.drawLine(0, origin.y, x_panel, origin.y);
    }
    
    public void drawHelpLines(Graphics2D line) {
    
        int xhelp= origin.x;
        int yhelp= origin.y;
        for (int i = 0; i < 20; i++) {
            xhelp+= div_x;
            line.drawLine(xhelp, 0, xhelp, y_panel);
        }
        xhelp= origin.x;
        for (int i = 0; i < 20; i++) {
            xhelp-= div_x;
    
            line.drawLine(xhelp, 0, xhelp, y_panel);
        }
    
        for (int i = 0; i < 20; i++) {
            yhelp-= div_y;
            line.drawLine(0, yhelp,x_panel, yhelp);
        }
        yhelp= origin.y;
        for (int i = 0; i < 20; i++) {
            yhelp+= div_y;
            line.drawLine(0, yhelp, x_panel, yhelp);
        }
    
    }
    
    public void setDivisionDefault() {
        div_x = 20;
        div_y = 20;
    
    }
    
    @Override
    public void mouseDragged(MouseEvent e) {
    
    
        //Point temp_point = new Point(mouse_x,mouse_y);
        Point coords = new Point(e.getX(), e.getY());
    
    
    
        setOrigin(coords);
    
        repaint();
    
    }
    
    @Override
    public void mouseMoved(MouseEvent e) {
    }
    }