2012-03-19 40 views
0

這個問題已經被別人問過了,但我還沒有明確的答案。塗漆後進入一條線

我已經創建了一個Line類和paint方法來繪製一條線。

我想知道我們如何在繪製後訪問線。我有兩個標記線的終點的JLabel。所以我可以使用它們調整行大小,但我不能選擇該行。

我也嘗試創建一個面板周圍,並添加mouseListener它,但它不是非常有效。

任何人都可以提出更聰明的方法嗎?

這裏是該行

public Line(Point a,Point b,JLabel l1,JLabel l2){ 
    this(a,b); 
    this.l1=l1; 
    this.l2=l2; 
    this.addMouseListener(this); 
} 
+1

爲了更好地幫助您,請發佈[SSCCE](http://sscce.org/)。 – 2012-03-19 09:49:20

回答

0

從你貼出來,我不能決定什麼,你居然有幾行的構造。線條的選擇不是已經準備好的東西。你需要實現它,但它很容易。 無論如何,你應該保持線的座標,並檢查鼠標監聽器上的鼠標點擊。

public void mousePressed(MouseEvent ev) 
{ 
    double TOLERANCE = 5; // Small tolerance measured in pixels 

    if (ev.getClickCount() == 1) 
    { 
    Point cursor = ev.getPoint(); 

    if (Math.abs(cursor.x - a.x) < TOLERANCE && 
     Math.abs(cursor.y - a.y) < TOLERANCE) 
    { 
     // Clicked on the first point 
    } 
    else if (Math.abs(cursor.x - b.x) < TOLERANCE && 
      Math.abs(cursor.y - b.y) < TOLERANCE) 
    { 
     // Clicked on the second point 
    } 
    } 
} 
0

您可以從Jcomponent還是一個合適的繼任類(即一個JButton)

然後覆蓋擴展您的線路的包含功能;

Shape shape; 
public boolean contains(int x, int y) { 
    // If the button has changed size, make a new shape object. 
    if (shape == null || !shape.getBounds().equals(getBounds())) { 
     shape = new Line2D.Float(a.x, a.y, b.x, b.y); 
    } 
    return shape.contains(x, y); 
} 

注意:Line2D.Float構造函數參數可能是無序的,我從內存中寫入。

2

創建Line2D對象。然後使用BasicStroke並定義線條的所需厚度。 使用方法

public Shape createStrokedShape(Shape s) 

獲取線條的描邊形狀。 使用線Shape的方法檢查點擊點是否在線。

+0

我覺得'包含'對'Line2D'來說總是爲false。 – 2012-03-19 12:04:33

2

@StanislavL有一個正確的想法,即使用實現Shape的類的方法,但是@Catalina注意到它對於Line2D總是爲false。相反,使用具有非空邊界的Shape呈現端點。例如,GraphPanel使用Rectangle來拖動每個端點。

GraphPanel

+0

+1 [maybe](http://stackoverflow.com/a/8588028/714968) – mKorbel 2012-03-19 15:20:54

+0

是的,你的例子說明了'RenderingHints'的好處! – trashgod 2012-03-19 15:29:10