2015-10-15 39 views
1

現在我正試圖獲得它,所以每當我點擊繪製的橢圓的內部時,拖動鼠標就會通過重繪來移動位置。但是,即使正確檢測到MouseEvents,橢圓形圖像也不會更新。我很困惑這是爲什麼。這裏是處理橢圓,MouseEvents和更新的代碼:面板不正確重新繪製Java中的圖像?

public class DrawOval extends JPanel { 
private int size = 50; 
private int locX = 0; //vector points 
private int locY = 0; 
private boolean isPressed = false; 
private Shape oval = new Ellipse2D.Double(locX, locY, size, size * 2); 

public DrawOval(int size){ 
    this.size = size; 
    Dimension dims = new Dimension(size, size); 
    setPreferredSize(dims); 
    setMaximumSize(dims); 
    setMinimumSize(dims); 

    MouseAdapter m = new MouseAdapter(){ 
     public void mouseReleased(MouseEvent e){ 
      isPressed = false; 
      update(e); 
      System.out.println("Mouse is released!"); 
     } 

     public void mousePressed(MouseEvent e){ 
      isPressed = true; 
      update(e); 
      System.out.println("Mouse is pressed!"); 
     } 

     public void mouseDragged(MouseEvent e){ 
      if(isPressed){ 
       update(e); 
       System.out.println("Mouse is dragged!"); 
      } 
     } 

     public void update(MouseEvent e){ 
      System.out.println("X: " + e.getX() + ", Y: " + e.getY()); 
      if(oval.contains(e.getX(), e.getY())){ 
       setX(e.getX()); setY(e.getY()); 
       repaint(); 
      } 
      //does not update if the mouses click coordinates are outside of the oval 
     } 
    }; 
    addMouseListener(m); //for pressing and releasing 
    addMouseMotionListener(m); //for dragging 
} 

public void setX(int _x){ 
    this.locX = _x; 
} 
public void setY(int _y){ 
    this.locY = _y; 
} 

public void paintComponent(Graphics g){ 
    super.paintComponent(g); 
    Graphics2D g2 = (Graphics2D) g; 
    g2.setColor(Color.BLACK); 
    g2.fill(oval); 
} 
} 

我找不出爲什麼它沒有正確更新。我之前已部分工作,但它會一直更新,即使用戶點擊的位置不在橢圓內。

+0

爲了更好地幫助更快,發佈[MCVE]或[短的,獨立的,正確的示例](http://www.sscce.org/)。 –

回答

0

我覺得做setXsetY你忘了在oval更新xy。您至少有三個選項:

1)重新創建Ellipse2D.Double每次更改this.locXthis.locY

2)期待您ovalx=0, y=0一勞永逸創建,請鼠標事件切換到相對座標(if(oval.contains(e.getX() - locX, e.getY() - locY)){...})和g2.transform(...)使用AffineTransform提請你oval

3)聲明橢圓形的Ellipse2D.Double oval = new Ellipse2D.Double(...);,然後你可以改變它的xy直接因爲他們是公衆:

oval.x = this.locX; 
    oval.y = this.locY;