Question:
Implementing drag and drop for a JLabel via mouse event overrides, the mouseReleased event fails to trigger upon mouse release when defined within the mousePressed event. Is there something am I doing incorrectly?"
Code:
<code class="java">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>
Answer:
While @Thomas's solution is correct, here are two alternative approaches to consider:
1. Using JLayeredPane:
This example demonstrates dragging a component using JLayeredPane. This variation expands on the same concept, while a more recent example uses a similar approach.
Code:
<code class="java">// ... private Point mousePt; private Point dragPt; private Rectangle bounds; public MouseDragTest() { this.addMouseMotionListener(new MouseMotionAdapter() { @Override public void mouseDragged(MouseEvent e) { int dx = e.getX() - mousePt.x; int dy = e.getY() - mousePt.y; dragPt.setLocation(dragPt.x + dx, dragPt.y + dy); super.mouseDragged(e); } }); this.addMouseListener(new MouseAdapter() { @Override public void mousePressed(MouseEvent e) { bounds = getBounds(); Point p = SwingUtilities.convertPoint(this, e.getPoint(), Bounds.Parent); if (bounds.contains(p)) { dragPt = p; mousePt = e.getPoint(); } } }); // ... }</code>
2. Using MouseMotionListener:
This code demonstrates using a MouseMotionListener. This more complex example uses the same principle.
Code:
<code class="java">// ... private Point offset; public MouseDragTest() { this.addMouseMotionListener(new MouseMotionAdapter() { @Override public void mouseDragged(MouseEvent e) { Point delta = e.getPoint(); Point pt = new Point(getLocation().x + delta.x - offset.x, getLocation().y + delta.y - offset.y); setLocation(pt); } }); this.addMouseListener(new MouseAdapter() { @Override public void mousePressed(MouseEvent e) { offset = e.getPoint(); } }); // ... }</code>
The above is the detailed content of Does MousePressed Method Inhibit MouseReleased from Triggering in JLabel Drag and Drop?. For more information, please follow other related articles on the PHP Chinese website!