How can I perform a task while the mouse is pressed, stopping when the mouse is released?
Created May 7, 2012
The "trick" is to create a new thread that performs the task while the normal event thread watches for the mouse release.
If you perform the mouse-pressed action inside your mousePressed() method, the event handler thread is busy; it's the one actually running your code. There's no way it can process the mouseReleased() event!
import java.awt.Frame; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; public class Sample { Thread worker; class Worker extends Thread { int n=0; public void run() { while(true) { System.out.println(n++); if (isInterrupted()) break; } } }; public static void main(String[] args) { new Sample().go(); } public void go() { Frame f = new Frame("Sample"); f.addMouseListener(new MouseAdapter() { public void mousePressed(MouseEvent e) { worker = new Worker(); worker.start(); } public void mouseReleased(MouseEvent e) { if (worker != null) { worker.interrupt(); worker = null; } } } ); f.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); }}); f.setBounds(10,10,100,100); f.setVisible(true); } }