我有一個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. 無法獲得的Java2D呈現一個簡單的線條到Graphics對象
- 2. 捕獲了在IE上一個SELECT click事件從選擇
- 3. 如何捕獲ListBox中第一個項目上的keyup事件?
- 4. C#通過一個事件從多個對象路由事件
- 5. jQuery:綁定另一個事件對象
- 6. 懸停在一個對象上以轉換另一個對象
- 7. 從另一個線程捕獲異常
- 8. 獲取一個對象到另一個
- 9. C#捕獲在另一個線程上調用委託異常
- 10. 幾個線程可能在同一個對象上等待嗎?
- 11. 添加一個事件到一個對象並處理它
- 12. c#異常拋出一個線程被捕獲在另一個線程
- 13. 從一個用戶控件捕獲數據網格事件到另一個
- 14. Java2D:用線條剪切圖形對象
- 15. 如何在使用jQuery將一個對象拖動到另一個對象上時觸發事件(函數)?
- 16. 兩個線程,一個對象
- 17. 如何獲取模型的上一個和下一個對象?
- 18. WPF:獲取下一個/上一個可視對象
- 19. 獲取JSON下一個和上一個對象
- 20. 的Win32:獲取一個事件對象的狀態
- 21. Angularjs - 獲得一個對象
- 22. 事件養在另一個線程
- 23. 對兩個對象使用一個事件偵聽器
- 24. 可以捕獲()寫入從一個對象類型轉換爲另一個?
- 25. 添加一個線程對象到一個JPanel在Java中
- 26. 另一個對象的Javascript自定義事件對象?
- 27. 如何每一個UIWebView加載請求時捕獲一個事件?
- 28. 如何捕獲從一個iframe中的所有事件,另一個內嵌
- 29. 鉤住一個複選框來捕獲一個被觸發的事件
- 30. 如何捕獲運行時對象上的事件