Drag and drop functionality can be implemented over a JLabel by overriding its mouse events. However, an issue arises when defining drag and drop in the mousePressed event, as it prevents the mouseReleased event from triggering on the same JLabel.
<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>
In this example, the mousePressed event is used to initiate the drag and drop process, but it consumes the mouse event and prevents the mouseReleased event from being triggered. As a result, the "here mouse released" message is not printed.
1. Using TransferHandler:
As @Thomas mentioned, TransferHandler can be used for drag and drop operations. It provides methods such as exportAsDrag() to initiate the dragging process.
2. Using MouseMotionListener:
This approach listens for mouse drag events to move the component rather than relying on mouse pressed and released events.
3. Using JLayeredPane:
Components can be dragged over a JLayeredPane using mouse events. Refer to the linked Stack Overflow examples for more details.
<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>
This implementation uses MouseMotionListener to handle mouse drag events and update the JLabel's position accordingly. The mouseReleased event is now triggered and the "here mouse released" message is printed.
The above is the detailed content of How to Override JLabel Mouse Events to Prevent Event Consumption During Drag and Drop?. For more information, please follow other related articles on the PHP Chinese website!