2015-05-14 35 views
0

正如標題所說,我希望能夠右鍵單擊我在Jpanel上繪製的線條。由於這些行不是組件,我不能簡單地將MouseListener添加到它們。目前,我吸取了我的JPanel線,下面的代碼:如何將鼠標監聽器添加到用Graphics.drawLine繪製的線條()

@Override 
public void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    Graphics2D g2d = (Graphics2D) g; 
    for (UserDrawnLine line : userDrawnLines) { 
     g.setColor(new Color(line.colorRValue,line.colorGValue, line.colorBValue)); 
     g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 
     g2d.setStroke(new BasicStroke(line.thickness)); 
     g.drawLine(line.startPointX, line.startPointY, line.endPointX, line.endPointY); 
    } 
} 

這是我UserDrawnLine類:

public class UserDrawnLine { 
    public int startPointX; 
    public int startPointY; 
    public int endPointX; 
    public int endPointY; 
    public int colorRValue; 
    public int colorGValue; 
    public int colorBValue; 
    public float thickness; 



    public UserDrawnLine(int startPointX, int startPointY, int endPointX, int endPointY, int colorRValue,int colorGValue,int colorBValue, float thickness) { 
     this.startPointX = startPointX; 
     this.startPointY = startPointY; 
     this.endPointX = endPointX; 
     this.endPointY = endPointY; 
     this.colorRValue=colorRValue; 
     this.colorBValue=colorBValue; 
     this.colorGValue=colorGValue; 
     this.thickness=thickness; 
    } 
} 

我一直在考慮存儲通過行雲點,然後反應因此當用戶在其中一個點上點擊Jpanel時。但是,這似乎並不是最好的解決方案。有更好的嗎?

回答

1

創建一個收線,並使用從MouseEventMouseListener提供的Point,遍歷集合並檢查點上的每個Line。您可能需要滾動您自己的Line類並實施contains方法(請注意,Line2D不能使用,因爲它的包含方法始終返回false)。

要確定一個點P是就行:

距離P)+ 距離P)= 距離A,B

其中AB是行終點,而P是測試點。可以使用一個誤差項來允許接近但不完全在線上的點(例如,當使用更寬的筆劃來渲染時,您可能希望增加此誤差項)。假設你的類具有端點一個b

public boolean contains(Point p, double error){ 
    double dist = Math.sqrt(Math.pow(p.x - a.x, 2) + Math.pow(p.y - a.y, 2)) + 
      Math.sqrt(Math.pow(p.x - b.x, 2) + Math.pow(p.y - b.y, 2)); 
    return Math.abs(dist - this.distance) <= error; 
} 
+1

['Line2D.contains'](http://docs.oracle.com/javase/8/docs/api/java/awt/geom /Line2D.html#contains-java.awt.geom.Point2D-)總是返回false,因此它絕對不能用於此目的。 – Radiodef

+0

@Radiodef,感謝您的澄清。該選項已被刪除。 – copeg

+0

@copeg非常感謝,你的解決方案就像一個魅力:) – Endrew