拖放功能可以透過覆蓋 JLabel 的滑鼠事件來實現。但是,在 mousePressed 事件中定義拖放時會出現問題,因為它會阻止在相同 JLabel 上觸發 mouseReleased 事件。
<code class="java">Thumbnails[I_Loop].setText("1"); Thumbnails[I_Loop].setTransferHandler(new TransferHandler("text")); Thumbnails[I_Loop].addMouseListener(new MouseAdapter() { public void mouseReleased(MouseEvent me) { System.out.println("here mouse released"); } public void mousePressed(MouseEvent me) { System.out.println("here mouse pressed"); JComponent comp = (JComponent) me.getSource(); TransferHandler handler = comp.getTransferHandler(); handler.exportAsDrag(comp, me, TransferHandler.COPY); } });</code>
在此範例中, mousePressed 事件用於啟動拖放過程,但它會消耗滑鼠事件並阻止 mouseReleased 事件被觸發。因此,不會列印“此處滑鼠已釋放”訊息。
1。使用 TransferHandler:
如 @Thomas 所提到的,TransferHandler 可用於拖放操作。它提供了諸如exportAsDrag()之類的方法來啟動拖曳過程。
2.使用 MouseMotionListener:
此方法偵聽滑鼠拖曳事件來移動元件,而不是依賴滑鼠按下和釋放事件。
3.使用 JLayeredPane:
可以使用滑鼠事件將組件拖曳到 JLayeredPane 上。有關更多詳細信息,請參閱連結的 Stack Overflow 範例。
<code class="java">Thumbnails[I_Loop].setTransferHandler(new TransferHandler("text")); Thumbnails[I_Loop].addMouseListener(new MouseAdapter() { public void mouseReleased(MouseEvent me) { System.out.println("here mouse released"); } }); Thumbnails[I_Loop].addMouseMotionListener(new MouseMotionAdapter() { @Override public void mouseDragged(MouseEvent e) { int dx = e.getX() - mousePt.x; int dy = e.getY() - mousePt.y; Thumbnails[I_Loop].setBounds(Thumbnails[I_Loop].getX() + dx, Thumbnails[I_Loop].getY() + dy, Thumbnails[I_Loop].getWidth(), Thumbnails[I_Loop].getHeight()); } });</code>
此實作使用 MouseMotionListener 來處理滑鼠拖曳事件並相應地更新 JLabel 的位置。現在會觸發 mouseReleased 事件並列印「此處滑鼠已釋放」訊息。
以上是如何覆寫 JLabel 滑鼠事件以防止拖放過程中事件消耗?的詳細內容。更多資訊請關注PHP中文網其他相關文章!