2010-05-14 41 views
2

我有一個JPanel,它有一個線,圓等。現在,當我點擊這一行時,事件將被報告爲線事件或一般JFrame事件。如果用戶點擊該線並移動它,我需要能夠移動該線。這在Java2D中可能嗎?Java2D:在一個線對象上捕獲一個事件

回答

4

是的,但您需要做一些工作(請參閱java.awt.Shape)。基本上你需要跟蹤形狀列表。 JPanel將接收鼠標事件,您可以將其轉換爲(x,y)座標。然後可以調用Shape.contains(x,y)來查看是否點擊了各種形狀。

這對圓形,多邊形,圓弧等很適用;但是在Line2D的情況下,它不會很容易工作,但是您可以使用Line2D.intersects()和鼠標點擊的小矩形(這也是一個好用戶界面,因爲您不希望強制用戶點擊恰好在難以看到的像素上)。

2

除非您決定實施一個「線條事件」,否則沒有這樣的概念。

我建議將MouseListenerMouseMotionListener添加到繪製幾何形狀的CanvasJPanel。使用MouseListenermousePressed(MouseEvent)回調來確定給定的形狀是否已被點擊。建立完成後,使用MouseMotionListenermouseDragged(MouseEvent)方法在移動鼠標光標時移動並重繪形狀。

1

下面是一個簡單的example,演示了其他答案中引用的一些技術。

0

我幾年前在Java中創建了一個畫布標記庫,如果您不需要擔心畫布上的變換(縮放,旋轉等),那很容易。

基本上你只需要維護列表中的畫布形狀的集合(不是集合,因爲Z順序可能很重要)。鼠標監聽器將位於您的畫布上,而不是單個形狀上。將新項目添加到集合的開始處(或稍後向後迭代列表)。

當畫布接收到鼠標向下的事件時,迭代所有形狀的集合,直到找到位於鼠標座標下方的集合。最簡單的方法是讓你的形狀實現一個定義某種hitPoint(int x,int y)方法的接口。這樣你的矩形可以實現一個contains(),線可以做intersects()或圖形路徑,你可以考慮一些命中填充等。

進一步,你的形狀應該定義自己的繪製(Graphics2D g)方法,以便您可以輕鬆完成諸如選擇框之類的操作,或將繪畫模式設置爲異或以使形狀「移動」更容易。你的畫布的paintComponent方法只需要遍歷你的圖形集合,在每個圖形上調用shape.draw(g),傳入提供給paintComponent方法的圖形實例。

相關問題