Cambiar el cursor predeterminado a cursor ocupado no funciona como se esperaba

Después de muchos intentos tratando de hacer unJProgressBar Trabajé como se esperaba, finalmente tuve éxito en lograr mi objetivo. Había usado@MadProgrammer'sConsejo y usé unSwingWorker para finalmente hacer que el programa funcione como yo quiero.

Ahora, quiero que el cursor cambie aBUSY_CURSOR http://telcontar.net/Misc/screeniecursors/Cursor%20hourglass%20white.png cuando miJProgressBar va del 0% al 100%. Busqué en Google y descubrí que

setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));

Es el código para hacerlo. Lo he intentado pero no funciona como se esperaba.

Pieza de código relevante:

JProgressBar progress;
JButton button;     
JDialog dialog;      //Fields of my GUI class

progress=new JProgressBar(JProgressBar.HORIZONTAL,0,100);
button=new JButton("Done");
dialog=new JDialog();             //Done from methods

progress.setValue(0);
progress.setStringPainted(true);
progress.setBorderPainted(true);  //Also done from methods

button.addActionListener(this);   //Also done from methods

dialog.setLayout(new FlowLayout(FlowLayout.CENTER));
dialog.setTitle("Please wait...");
dialog.setBounds(475,150,250,100);
dialog.setModal(true);            //Also done from methods

dialog.add(new JLabel("Loading..."));
dialog.add(progress);             //Also done from methods

Y aquí está elactionPerformed método:

public void actionPerformed(ActionEvent e)
{
    setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));

    Task task=new Task();
    task.addPropertyChangeListener(this);
    task.execute();
    dialog.setVisible(true);
}

lospropertyChange método:

public void propertyChange(PropertyChangeEvent evt) {
    if("progress" == evt.getPropertyName()){
        int progressnum = (Integer) evt.getNewValue();
        progress.setValue(progressnum);
    }
}

y la clase anidadaTask:

   class Task extends SwingWorker<Void, Void> {
        /*
         * Main task. Executed in background thread.
         */
        @Override
        public Void doInBackground() {
            int progressnum = 0;
            setProgress(0);

            while (progressnum < 100) {
                try {
                    Thread.sleep(10);
                } catch (InterruptedException ex) {
                    System.err.println("An error occured:"+ex);
                    ex.printStackTrace();
                }

                progressnum ++;
                setProgress(Math.min(progressnum, 100));
            }
            return null;
        }

        /*
         * Executed in event dispatching thread
         */
        @Override
        public void done() {
            //setCursor(null); //turn off the wait cursor
            setCursor(Cursor.getDefaultCursor()); //Is this one or the one above it right?
            dialog.dispose();
            progress.setValue(progress.getMinimum());
        }
    }

Cuando presionobutton, aparece el JDialog con el JProgressBar y el JProgressBar va del 0% al 100%. Durante este tiempo, el cursor debe cambiarse aBUSY_CURSOR http://telcontar.net/Misc/screeniecursors/Cursor%20hourglass%20white.png(cursor ocupado) y cuando JProgressBar alcanza el 100%, el cursor normal (NORMAL_CURSOR http://fc05.deviantart.net/fs70/i/2011/008/1/4/mouse_cursor_windows_by_mikima-d36oslj.png) necesita ser restaurado.

El problema es que cuando presionobutton, el cursor cambia al cursor ocupado durante una fracción de segundo y luego vuelve a cambiar al cursor original. Quiero que el cursor esté ocupado hasta que JProgressBar llegue al 100%.

He agregado el código para convertir el cursor en un cursor ocupado en elactionPerformed método y la restauración del cursor normal en eldone método de la clase anidadaTask. Tenga en cuenta que también he incluido los paquetes necesarios.

¿Qué está causando el problema?¿Cómo lo soluciono?

Debería usar

setCursor(null);

o

setCursor(Cursor.getDefaultCursor());

para restaurar el cursor?

Respuestas a la pregunta(2)

Su respuesta a la pregunta