我有一個JPanel,它有一個線,圓等。現在,當我點擊這一行時,事件將被報告爲線事件或一般JFrame事件。如果用戶點擊該線並移動它,我需要能夠移動該線。這在Java2D中可能嗎?Java2D:在一個線對象上捕獲一個事件
回答
是的,但您需要做一些工作(請參閱java.awt.Shape)。基本上你需要跟蹤形狀列表。 JPanel將接收鼠標事件,您可以將其轉換爲(x,y)座標。然後可以調用Shape.contains(x,y)來查看是否點擊了各種形狀。
這對圓形,多邊形,圓弧等很適用;但是在Line2D的情況下,它不會很容易工作,但是您可以使用Line2D.intersects()和鼠標點擊的小矩形(這也是一個好用戶界面,因爲您不希望強制用戶點擊恰好在難以看到的像素上)。
除非您決定實施一個「線條事件」,否則沒有這樣的概念。
我建議將MouseListener
和MouseMotionListener
添加到繪製幾何形狀的Canvas
或JPanel
。使用MouseListener
的mousePressed(MouseEvent)
回調來確定給定的形狀是否已被點擊。建立完成後,使用MouseMotionListener
的mouseDragged(MouseEvent)
方法在移動鼠標光標時移動並重繪形狀。
下面是一個簡單的example,演示了其他答案中引用的一些技術。
我幾年前在Java中創建了一個畫布標記庫,如果您不需要擔心畫布上的變換(縮放,旋轉等),那很容易。
基本上你只需要維護列表中的畫布形狀的集合(不是集合,因爲Z順序可能很重要)。鼠標監聽器將位於您的畫布上,而不是單個形狀上。將新項目添加到集合的開始處(或稍後向後迭代列表)。
當畫布接收到鼠標向下的事件時,迭代所有形狀的集合,直到找到位於鼠標座標下方的集合。最簡單的方法是讓你的形狀實現一個定義某種hitPoint(int x,int y)方法的接口。這樣你的矩形可以實現一個contains(),線可以做intersects()或圖形路徑,你可以考慮一些命中填充等。
進一步,你的形狀應該定義自己的繪製(Graphics2D g)方法,以便您可以輕鬆完成諸如選擇框之類的操作,或將繪畫模式設置爲異或以使形狀「移動」更容易。你的畫布的paintComponent方法只需要遍歷你的圖形集合,在每個圖形上調用shape.draw(g),傳入提供給paintComponent方法的圖形實例。
- 1. 在kivy的一個觸摸事件上旋轉一個對象
- 2. 無法獲得的Java2D呈現一個簡單的線條到Graphics對象
- 3. 貪婪不捕獲第一個事件
- 4. 將一個對象的事件委託給另一個對象
- 5. 捕獲了在IE上一個SELECT click事件從選擇
- 6. 一個對象,多個onclick事件
- 7. 捕獲onMinimize事件對於一個窗體(德爾福)
- 8. 如何捕獲ListBox中第一個項目上的keyup事件?
- 9. C#通過一個事件從多個對象路由事件
- 10. jQuery:綁定另一個事件對象
- 11. 懸停在一個對象上以轉換另一個對象
- 12. 從另一個線程捕獲異常
- 13. 開始一個新的線程捕獲
- 14. 獲取一個對象到另一個
- 15. C#捕獲在另一個線程上調用委託異常
- 16. Java2D:用線條剪切圖形對象
- 17. 從上一個JSON對象獲取值
- 18. 幾個線程可能在同一個對象上等待嗎?
- 19. 添加一個事件到一個對象並處理它
- 20. 製作一個事件變量在畫布上畫一條線
- 21. c#異常拋出一個線程被捕獲在另一個線程
- 22. 從一個用戶控件捕獲數據網格事件到另一個
- 23. 捕獲一個GenericJDBCException
- 24. 如何在使用jQuery將一個對象拖動到另一個對象上時觸發事件(函數)?
- 25. 在一個選項卡中捕獲MouseEnter事件[Javafx]
- 26. 在一個目錄內發生的捕獲事件
- 27. 在Cocoa/Obj-C中,如何捕獲一個cmd-c事件?
- 28. 同步對象在一個線程鎖定,而在另一個
- 29. 兩個線程,一個對象
- 30. 使用ajax請求獲取上一個和下一個對象