我正在開展一項學校作業,要求我能夠拾取一個圖塊並將其拖放到某個位置,然後將其放到那裏。我可以使用TransferHandler
和dnd包中的一些東西來實現這個工作,但根據教授的說法,這不是一種可接受的方式來執行此任務。所以,我試圖用MouseListener
接口達到相同的效果。使用MouseListener實現自定義組件的拖放操作
基本設置是這樣的:我有一個名爲LocationView
一個JPanel
派生類,它包含的TileView
JLabel
-dervived實例。我需要得到的事件給我的LocationView
有鼠標按下和LocationView
有鼠標釋放。我通過TileView
代理鼠標事件到其包含LocationView
,以便我可以正確處理mousePressed
事件。
我加System.out.println()
的鼠標偵聽器mousePressed
和mouseReleased
既LocationView
和TileView
這樣我就可以看到正在發生的事件。令我驚訝的是,在地點A的平鋪A上按下鼠標,然後拖動到地點B並釋放,將爲平鋪A和地點A生成鼠標釋放事件,但不生成地點B.我需要鼠標釋放事件位置B.
要嘗試解決此問題,我嘗試實施基於FinalGlassPane
的http://weblogs.java.net/blog/2006/09/20/well-behaved-glasspane找到的玻璃窗格。添加玻璃窗格併爲其添加事件偵聽器後,我可以看到鼠標事件確實正在通過玻璃窗格進行過濾,但鼠標釋放的事件仍然只在鼠標點擊的項目上被調用。
有沒有辦法讓mousePressed
和mouseReleased
事件與同一拖動操作相關聯,並在不同的組件上調用?
編輯: 這裏是我到達,基於關閉答案通過lins314159
public void mouseReleased(MouseEvent e) {
Point p = SwingUtilities.convertPoint(LocationView.this, ((Component)e.getSource()).getLocation(), LocationView.this.wsa.getGameView());
e.translatePoint((int) p.getX(), (int) p.getY());
Component tile = SwingUtilities.getDeepestComponentAt(LocationView.this.wsa.getGameView(), e.getX(), e.getY());
}
該來源位置的翻譯似乎沒有在我的情況下工作。當我點擊一個圖塊時,我得到的源位置爲1,1,然後將它們轉換爲我所在的圖塊。這意味着生成的座標不正確,導致錯誤的組件選擇。 – 2010-04-01 01:56:49
我調整了一下你的代碼,最終讓它工作。由於我擁有嵌套組件的數量,所以需要進行調整。該解決方案作爲對原始問題的編輯發佈。 – 2010-04-01 02:11:41