Java:鼠标在图形界面中拖动和移动

2022-01-11 00:00:00 drag-and-drop java swing paintcomponent awt

这里是新手程序员.

我正在制作一个程序,在笛卡尔坐标系中呈现用户输入的方程.目前,我在让用户在坐标中自由移动视图方面遇到了一些问题.目前使用 mouseDragged 用户可以稍微拖动视图,但是一旦用户释放鼠标并尝试再次移动视图,原点就会重新回到鼠标光标的当前位置.让用户自由移动的最佳方式是什么?提前致谢!

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!

这是绘图区的代码.

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) {
}
}

推荐答案

基于这个example,下面的程序允许用户将坐标轴的交点拖动到任意点 origin,该点从面板的中心开始.

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.

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);
            }
        });
    }
}

相关文章