加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

Java:mouseDragged并在图形界面中移动

发布时间:2020-12-15 07:37:30 所属栏目:Java 来源:网络整理
导读:新手程序员在这里. 我正在制作一个程序,用于在笛卡尔坐标系中呈现用户输入的方程.目前我遇到一些让用户在坐标中自由移动视图的问题.目前使用mouseDragged,用户可以稍微拖动视图,但是一旦用户释放鼠标并尝试再次移动视图,原点就会快速回到鼠标光标的当前位置.
新手程序员在这里.

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

这是绘图区域的代码.

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,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,xhelp,y_panel);
    }
    xhelp= origin.x;
    for (int i = 0; i < 20; i++) {
        xhelp-= div_x;

        line.drawLine(xhelp,y_panel);
    }

    for (int i = 0; i < 20; i++) {
        yhelp-= div_y;
        line.drawLine(0,yhelp,yhelp);
    }
    yhelp= origin.y;
    for (int i = 0; i < 20; i++) {
        yhelp+= div_y;
        line.drawLine(0,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,以下程序允许用户将轴的交点拖动到从面板中心开始的任意点原点.

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,getWidth(),origin.y);
        g.drawLine(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);
            }
        });
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读