2016-03-04 51 views
1

我正试图创建一个程序,使用户可以在空间中拖放椭圆。我能够拖放,但在我尝试在第二次运行后再次尝试时,椭圆形跳至各个位置。我想知道有没有人知道为什么会发生这种情况?我错过了什么吗?谢谢使用鼠标拖动对象侦听器

public class MoveOval extends JFrame { 

private Ellipse2D node = new Ellipse2D.Float(200,200,80,120); 
private Point offset; 
private int preX,preY; 
private Image dbImage; 
private Graphics dbg; 
Adapter ma = new Adapter(); 

public static void main(String args[]){ 
    JFrame frame = new MoveOval(); 
    frame.setSize(600,600); 
    frame.setVisible(true); 
} 

public MoveOval(){ 
    super("Move Oval"); 
    setDefaultCloseOperation(EXIT_ON_CLOSE); 
    addMouseListener(ma); 
    addMouseMotionListener(ma); 

} 
private class Adapter extends MouseAdapter{ 
    public void mousePressed(MouseEvent e){ 
     if(node.contains(e.getPoint())){ 
      preX = node.getBounds().x-e.getX(); 
      preY = node.getBounds().y-e.getX(); 
      offset = new Point(preX, preY); 
     } 
    } 
    public void mouseDragged(MouseEvent e){ 
     if(node.contains(e.getPoint())){ 
      updateLocation(e); 
     } 
    } 
    public void mouseReleased(MouseEvent e) { 
      offset=null; 
     } 

} 

public void updateLocation(MouseEvent e){ 
    Point to = e.getPoint(); 
    to.x += offset.x; 
    to.y += offset.y; 

    Rectangle bounds = node.getBounds(); 
    bounds.setLocation(to); 
    node.setFrame(bounds); 

    repaint(); 
} 

public void paint(Graphics g){ 
    dbImage=createImage(getWidth(), getHeight()); 
    dbg = dbImage.getGraphics(); 
    paintComponent(dbg); 
    g.drawImage(dbImage, 0, 0, this); 
} 
public void paintComponent(Graphics g){ 
    Graphics2D gd = (Graphics2D)g.create(); 
    gd.setColor(Color.blue); 
    gd.fill(node); 

    } 
} 
+0

如果您要创建并发布有效[mcve](请查看重要详细信息的链接),效果会更好。此外,您不应该直接在JFrame的绘画方法中绘制,因为这需要麻烦,尤其是当您通过不调用任何超级方法来打破绘画链时。 –

回答

2

其实很简单的一个错误,很容易修复。

public void mousePressed(MouseEvent e){ 
     if(node.contains(e.getPoint())){ 
      preX = node.getBounds().x-e.getX(); 
      preY = node.getBounds().y-e.getX(); // <- That's the bad guy. 
      offset = new Point(preX, preY); 
     } 
    } 

它必须-e.getY()不-e.getX()。

+0

谢谢你!我不敢相信我没有看到。 :) –

+1

这种事情偶尔也会发生在我身上,当我真的很累的时候。有时候,这是你错过的简单错误。无论如何,如果您将此标记为正确答案,我将不胜感激。 – Mark

+0

@HuyTrinh:你会想要接受和提高Mark的答案。有关详情,请从帮助网站阅读本节:[某人回答](http://stackoverflow.com/help/someone-answers)。但请注意,您仍然不应该在JFrame中绘制,而应该在JPanel的paintComponent方法中绘制,并且仍然应该记得调用super的绘画方法。 1+这个答案。 –