2013-07-12 54 views
0

所以,我有一個地圖,我想能夠繪製矩形來突出顯示一個區域。當鼠標被釋放時,在地圖上繪製一個永久的矩形,該矩形一直存在,直到再次拖動鼠標開始創建新的矩形。拖動鼠標時,應該創建矩形輪廓。併發問題與Grahpics2D繪製和JPanel重繪

當鼠標重新點擊時,持續的矩形被刪除,給定的應用程序將意味着一個新的拖動事件將開始。

會發生什麼情況是,第一個矩形被正確地繪製並且一切都很好,但是隨後正在拖動的矩形已將角切除(底部的圖像鏈接)。

如果我點擊並等待圖像重新繪製,然後再開始拖動,那麼此問題不存在,以及在開始繪製onMouseDragged中的矩形之前我已經睡過線程,以便它有時間重新繪製。

我想要一個更優雅的解決方案,讓那些允許在屏幕上顯示onMouseDragged中創建的矩形之前重畫屏幕。那麼在沒有切換繪製矩形的一部分的情況下完成重繪的最佳方法是什麼?

請注意,儘管看起來輪廓,繪製的持久矩形是正確的。

這是長方形的樣子 the weird rectangle

public void onMousePressed(MapMouseEvent ev) 
{  

    startPos = new Point(ev.getPoint()); 
    drawer.removeDrawings(pane.getMapContent()); 
    pane.repaint(); 
    pane.setIgnoreRepaint(true);   
} 

public void onMouseDragged(MapMouseEvent ev) 
{ 
    super.onMouseDragged(ev); 
    if (enabled) { 
     ensureGraphics(); 
     if (dragged) 
     { 
      // because we're in XOR mode, this has the effect of erases the previous rectangle 
      graphics.drawRect(rect.x, rect.y, rect.width, rect.height); 
     } 
     else 
     { 


     } 
     rect.setFrameFromDiagonal(startPos, ev.getPoint()); 
     graphics.drawRect(rect.x, rect.y, rect.width, rect.height); 
     dragged = true; 

    } 
} 
public void onMouseReleased(MapMouseEvent ev) 
{ 
    super.onMouseReleased(ev); 
    if (dragged) { 
     ensureGraphics(); 
     dragged = false;   

     drawer drawable = new drawer(); 
     drawable.drawRectangle((Graphics2D) parentComponent.getGraphics().create(), rect.x, rect.y, rect.width, rect.height, pane.getMapContent()); 

     graphics.dispose(); 
     graphics = null; 
     pane.setIgnoreRepaint(false);   
     pane.repaint(); 

    } 
} 
+0

爲了更快提供更好的幫助,請發佈[SSCCE](http://sscce.org/)。還有,你的問題是什麼? –

+0

我會嘗試編寫一個簡短的可編譯示例。實際的問題是我如何獲得屏幕重繪,以避免不訴諸睡覺或明確要求用戶點擊並按住屏幕重新繪製之前繪製的矩形。 – NolanPower

+0

當你去編輯你的問題到實際問題時,不要忘記添加一個實際的'?'最後。 ;) –

回答

1

你需要保持一個List<Rectangle>,並添加當前Rectangle到列表上mouseReleased()GraphPanel說明了基本的鼠標處理。在你的情況下,只需渲染圖像,任何現有的矩形和當前的矩形。

@Override 
public void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    // render background 
    g.drawImage(image, 0, 0, this); 
    // render existing rectangles 
    for (Rectangle r : list) { 
     r.draw(g); 
    } 
    // render the current dragged rectangle 
    if (selecting) { 
     g.setColor(Color.darkGray); 
     g.drawRect(mouseRect.x, mouseRect.y, 
      mouseRect.width, mouseRect.height); 
    } 
} 

在該示例中,selecting是控制一個新的矩形是否被繃繪製或現有選擇被拖動到一個新位置的布爾值。

因爲所有的渲染必須發生在EDT,我懷疑你需要(或想要)一個新的線程。