2013-03-22 80 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