2010-03-31 54 views
1

我正在開展一項學校作業,要求我能夠拾取一個圖塊並將其拖放到某個位置,然後將其放到那裏。我可以使用TransferHandler和dnd包中的一些東西來實現這個工作,但根據教授的說法,這不是一種可接受的方式來執行此任務。所以,我試圖用MouseListener接口達到相同的效果。使用MouseListener實現自定義組件的拖放操作

基本設置是這樣的:我有一個名爲LocationView一個JPanel派生類,它包含的TileViewJLabel -dervived實例。我需要得到的事件給我的LocationView有鼠標按下和LocationView有鼠標釋放。我通過TileView代理鼠標事件到其包含LocationView,以便我可以正確處理mousePressed事件。

我加System.out.println()的鼠標偵聽器mousePressedmouseReleasedLocationViewTileView這樣我就可以看到正在發生的事件。令我驚訝的是,在地點A的平鋪A上按下鼠標,然後拖動到地點B並釋放,將爲平鋪A和地點A生成鼠標釋放事件,但不生成地點B.我需要鼠標釋放事件位置B.

要嘗試解決此問題,我嘗試實施基於FinalGlassPanehttp://weblogs.java.net/blog/2006/09/20/well-behaved-glasspane找到的玻璃窗格。添加玻璃窗格併爲其添加事件偵聽器後,我可以看到鼠標事件確實正在通過玻璃窗格進行過濾,但鼠標釋放的事件仍然只在鼠標點擊的項目上被調用。

有沒有辦法讓mousePressedmouseReleased事件與同一拖動操作相關聯,並在不同的組件上調用?

編輯: 這裏是我到達,基於關閉答案通過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

雖然它很可能可能有mouseReleased給予實際的組件鼠標發佈了作爲其源解決方案,它會比它的價值更麻煩。

以下內容可用於識別釋放鼠標的組件。

public void mouseReleased(MouseEvent evt) { 
    Point p = ((Component) evt.getSource()).getLocation(); 
    evt.translatePoint((int) p.getX(), (int) p.getY()); 
    Component tile = f.getContentPane().getComponentAt(evt.getX(), evt.getY()); 
} 
+0

該來源位置的翻譯似乎沒有在我的情況下工作。當我點擊一個圖塊時,我得到的源位置爲1,1,然後將它們轉換爲我所在的圖塊。這意味着生成的座標不正確,導致錯誤的組件選擇。 – 2010-04-01 01:56:49

+0

我調整了一下你的代碼,最終讓它工作。由於我擁有嵌套組件的數量,所以需要進行調整。該解決方案作爲對原始問題的編輯發佈。 – 2010-04-01 02:11:41