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); } }); } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- Java求10到100000之间的水仙花数算法示例
- java – Aspectj没有捕获spring框架中的所有事件?
- Java方法链接在单行上进行转换
- junit – Arquillian:Wildfly嵌入?
- 当使用LogManager(l4j2)与Java 8(java.lang.reflect.Annota
- 如何从Java EE应用程序发送事件(推送通知)?
- Spring Boot与Kotlin处理Web表单提交的方法
- java – 用于检查非null而非空的Lombok构建器
- java使用正则表达式判断邮箱格式是否正确的方法
- java – JVM(64位1.5.0._22)在GCTaskThread崩溃