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

вам нужно закрыть свой комментарий где-то .. –

+0

К сожалению, это было ошибкой с моей стороны. Это сокращенная версия фактического кода, и мне пришлось перевести некоторые переменные и комментарии на английский язык. – Matti

+0

Вам также необходимо опубликовать полный код: есть куча необъявленных переменных. пожалуйста, отправьте сообщение [SSCCE] (http://sscce.org) –

ответ

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

+0

Добро пожаловать. – trashgod

Смежные вопросы