[英]Implementing Drag and Drop using MouseListener for custom Components
我正在做一項學校作業,要求我能夠拿起一塊瓷磚,將其拖到某個位置,然后放到那里。 我能夠使用TransferHandler
和dnd包中的一堆東西使它正常工作,但是根據教授的說法,這不是執行此操作的可接受方法。 因此,我正在嘗試使用MouseListener
接口實現相同的效果。
基本設置是這樣的:我有一個JPanel
派生類稱為LocationView
包含JLabel
-dervived的實例TileView
。 我需要的是給我的事件LocationView
有壓在鼠標和LocationView
有釋放鼠標。 我通過TileView
將鼠標事件代理到其包含的LocationView
以便可以正確處理mousePressed
事件。
我將System.out.println()
添加到LocationView
和TileView
mousePressed
和mouseReleased
鼠標偵聽器中,以便可以觀察正在生成的事件。 令我驚訝的是,在位置A的圖塊A上按鼠標,然后拖動到位置B並釋放會為圖塊A和位置A生成鼠標釋放事件,但對於位置B都不會。我只需要觸發鼠標釋放事件位置B。
為了解決此問題,我嘗試基於在以下FinalGlassPane
找到的FinalGlassPane
實現玻璃窗格: http: FinalGlassPane
。 添加玻璃窗格並為其添加事件偵聽器之后,我可以看到鼠標事件確實在玻璃窗格中過濾,但是鼠標釋放事件仍僅在單擊鼠標的項目上被調用。
是否可以在單獨的組件上調用與同一拖動動作相關的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());
}
盡管有可能讓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());
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.