簡體   English   中英

使用MouseListener為自定義組件實現拖放

[英]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()添加到LocationViewTileView mousePressedmouseReleased鼠標偵聽器中,以便可以觀察正在生成的事件。 令我驚訝的是,在位置A的圖塊A上按鼠標,然后拖動到位置B並釋放會為圖塊A和位置A生成鼠標釋放事件,但對於位置B都不會。我只需要觸發鼠標釋放事件位置B。

為了解決此問題,我嘗試基於在以下FinalGlassPane找到的FinalGlassPane實現玻璃窗格: http: FinalGlassPane 添加玻璃窗格並為其添加事件偵聽器之后,我可以看到鼠標事件確實在玻璃窗格中過濾,但是鼠標釋放事件仍僅在單擊鼠標的項目上被調用。

是否可以在單獨的組件上調用與同一拖動動作相關的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());
}

盡管有可能讓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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM