2013-03-22 83 views
1

新手程序员在这里。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, 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) { 
} 
} 
+2

你需要的地方关闭您的评论.. – 2013-03-22 15:28:34

+0

对不起,那是我犯的一个错误。这是实际代码的缩写版本,我必须将一些变量和注释翻译成英文。 – Matti 2013-03-22 15:32:27

+0

您还需要发布完整的代码:有一堆未声明的变量。请发布[SSCCE](http://sscce.org) – 2013-03-22 15:36:59

回答

6

在此基础上example,下面的程序允许用户轴线相交拖动到的任意的点,origin,其开始于所述面板的中心。

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

非常感谢! – Matti 2013-03-22 17:33:39

+0

不客气。 – trashgod 2013-03-22 17:57:35