obteniendo el evento cancel de Java ProgressMonitor

Tengo un ProgressMonitorpm y un SwingWorkersw. Quiero cancelar el SwingWorker cuando presiono la teclacancel-botón enpm. Creo que esto no debería ser demasiado difícil, y leí algunos tutoriales sobre SwingWorker y ProgressMonitor, pero no puedo hacer que esto funcione.

final ProgressMonitor pm = new ProgressMonitor(frame, "checking", "...", 0, 100);
final SwingWorker sw = new SwingWorker()
{
    protected Object doInBackground() throws Exception 
    {
        doSomethingAndUpdateProgress();
    }
};

sw.addPropertyChangeListener(new PropertyChangeListener()
{
    public void propertyChange(PropertyChangeEvent evt)
    {
        if(evt.getPropertyName().equals("progress"))
        {
            updateProgress();
        }
        if(pm.isCanceled())
        {
            cancelAction();
        }
        if(pm.isDone())
        {
            doneAction();
        }
    }
});

sw.execute();

La actualización del progreso está funcionando bien, peropm.isCanceled() es nuncatrue. Supongo que necesito un propertyChangeListener para ProgressMonitor, pero no sé cómo agregaría uno allí.

Respuestas a la pregunta(2)

Su respuesta a la pregunta